Bu oldukça eski bir soru olduğunu biliyorum, ama ben iç içe JSON a jenerik olarak serileştirmek için bir çözüm arıyordu Map<String, Object>
ve hiçbir şey bulunamadı.
Yaml deserializer'ımın çalışma şekli, Map<String, Object>
bir tür belirtmediğinizde varsayılan olarak JSON nesnelerini kullanır, ancak gson bunu yapmıyor gibi görünüyor. Neyse ki bunu özel bir deserializer ile başarabilirsiniz.
Ben varsaymak, doğal serisi kaldırılmaya şey şu deserializer kullanılan JsonObject
etmek lar Map<String, Object>
ve JsonArray
s Object[]
tüm çocukların benzer serileştirilemezse edilir s.
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
Yöntemin içindeki dağınıklık , yalnızca bir Double veya Tamsayı veya Long elde etmenizi sağlamaktır ve muhtemelen daha iyi olabilir veya en azından varsayılan olan BigDecimals'i almakta sorun yaşıyorsanız en azından basitleştirilebilir.
Bu bağdaştırıcıyı aşağıdaki gibi kaydedebilirsiniz:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());
Gson gson = gsonBuilder.create();
Ve sonra şöyle deyin:
Object natural = gson.fromJson(source, Object.class);
Diğer yarı yapılandırılmış serileştirme kitaplıklarında olduğundan, neden gson'daki varsayılan davranış olmadığından emin değilim ...
Map<String,Object> result = new Gson().fromJson(json, Map.class);
gson ile çalışır 2.6.2.