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?
解决方案
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(private val gson: Gson) :JsonDeserializer {
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(Gson()))
.create()