问题
I want to deserialize a json string that containts a null value in Java. I want to deserialize the object to a Properties object. The json string is something like:
{"prop1":null, "propr2":"fancy value"}
When I deserialize using
String json = //
new Gson().fromJson(json, Properties.class);
I get a null pointer exception because of the Hastable that into the Properties object. How can I instruct Gson to ignore deserialization of null values?
回答1:
We have this solution:
1. All of your data classes need to extends abstract class
abstract class PoJoClass
2. Create this safe deserializer to delete nulls from JSON
class SafeDeserializer<T : PoJoClass>(private val gson: Gson) :JsonDeserializer<T> {
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): T {
val jsonObject = json as JsonObject
removeNullsFromJson(jsonObject)
return gson.fromJson(jsonObject, typeOfT)
}
private fun removeNullsFromJson(jsonObject: JsonObject) {
val iterator = jsonObject.keySet().iterator()
while (iterator.hasNext()) {
val key = iterator.next()
when(val json = jsonObject[key]){
is JsonObject -> removeNullsFromJson(json)
is JsonNull -> iterator.remove()
}
}
}
}
3. And register it in your GSON instance
val gson = Gson().newBuilder()
.registerTypeHierarchyAdapter(PoJoClass::class.java, SafeDeserializer<PoJoClass>(Gson()))
.create()
回答2:
See http://sites.google.com/site/gson/gson-user-guide#TOC-Null-Object-Support:
Gson gson = new GsonBuilder().serializeNulls().create();
来源:https://stackoverflow.com/questions/33301036/gson-ignore-null-when-deserializing-object