আমি জানি এটি মোটামুটি পুরানো প্রশ্ন, তবে আমি নেস্টেড জেএসওএন-এর কাছে জেনারিকভাবে ডিসরিয়ালাইজ করার একটি সমাধান খুঁজছিলাম Map<String, Object>
, এবং কিছুই পাইনি।
আমার ইয়ামল ডিজিজারাইজারটি যেভাবে কাজ করে, আপনি Map<String, Object>
যখন কোনও প্রকার নির্দিষ্ট না করে তা JSON অবজেক্টগুলিকে ডিফল্ট করে তোলে তবে জিএসন এটি করবে বলে মনে হয় না। ভাগ্যক্রমে আপনি এটি একটি কাস্টম ডিসরিয়ালাইজার দিয়ে সম্পন্ন করতে পারেন।
আমি স্বাভাবিকভাবেই deserialize কিছু নিম্নলিখিত deserializer ব্যবহৃত, খেলাপি JsonObject
করার গুলি Map<String, Object>
এবং JsonArray
গুলি Object[]
গুলি, যেখানে সব শিশুদের একভাবে deserialized করছে।
private static class NaturalDeserializer implements JsonDeserializer<Object> {
public Object deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) {
if(json.isJsonNull()) return null;
else if(json.isJsonPrimitive()) return handlePrimitive(json.getAsJsonPrimitive());
else if(json.isJsonArray()) return handleArray(json.getAsJsonArray(), context);
else return handleObject(json.getAsJsonObject(), context);
}
private Object handlePrimitive(JsonPrimitive json) {
if(json.isBoolean())
return json.getAsBoolean();
else if(json.isString())
return json.getAsString();
else {
BigDecimal bigDec = json.getAsBigDecimal();
// Find out if it is an int type
try {
bigDec.toBigIntegerExact();
try { return bigDec.intValueExact(); }
catch(ArithmeticException e) {}
return bigDec.longValue();
} catch(ArithmeticException e) {}
// Just return it as a double
return bigDec.doubleValue();
}
}
private Object handleArray(JsonArray json, JsonDeserializationContext context) {
Object[] array = new Object[json.size()];
for(int i = 0; i < array.length; i++)
array[i] = context.deserialize(json.get(i), Object.class);
return array;
}
private Object handleObject(JsonObject json, JsonDeserializationContext context) {
Map<String, Object> map = new HashMap<String, Object>();
for(Map.Entry<String, JsonElement> entry : json.entrySet())
map.put(entry.getKey(), context.deserialize(entry.getValue(), Object.class));
return map;
}
}
handlePrimitive
পদ্ধতির অভ্যর্থনা হ'ল এটি নিশ্চিত করার জন্য যে আপনি কেবল কখনও দ্বিগুণ বা একটি পূর্ণসংখ্যা বা একটি দীর্ঘ পেতে পারেন এবং সম্ভবত এটি আরও ভাল হতে পারে বা কমপক্ষে সরলকরণে যদি আপনি বিগডিসিমালগুলি পেয়ে ঠিক থাকেন তবে আমি বিশ্বাস করি এটি ডিফল্ট।
আপনি এই অ্যাডাপ্টারের মতো নিবন্ধন করতে পারেন:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());
Gson gson = gsonBuilder.create();
এবং তারপরে এটিকে কল করুন:
Object natural = gson.fromJson(source, Object.class);
আমি নিশ্চিত না যে কেন এটি জিএসএন-এ ডিফল্ট আচরণ নয়, কারণ এটি বেশিরভাগ অন্যান্য আধা-কাঠামোগত সিরিয়ালাইজেশন লাইব্রেরিতে রয়েছে ...
Map<String,Object> result = new Gson().fromJson(json, Map.class);
gson 2.6.2 এর সাথে কাজ করে।