我必须将 0
反序列化为 false
并将 1
反序列化为 true
。
我创建了这个类:
class IntBooleanDeserializer : JsonDeserializer<Boolean?> {
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Boolean? {
json?.let {
return json.asInt == 1
}
return null
}
}
并注册它:
private val gson = GsonBuilder()
.registerTypeAdapter(Boolean::class.java, IntBooleanDeserializer())
.create()
并为此创建了测试类:
data class BooleanClass(val value: Boolean?)
然后:
gson.fromJson("{\"value\": 0}", BooleanClass::class.java)
这段代码抛出异常:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a boolean but was NUMBER at line 1 column 12 path $.value
似乎 Gson 没有将我的反序列化器用于 Boolean?
,但成功地将其他自定义反序列化器用于其他类型(例如,用于枚举)。
为什么?
最佳答案
您正在为 Boolean::class.java
注册反序列化器,它是 boolean
而您实际需要的类型是 Boolean?
到 java.lang.Boolean
。
要获得 java.lang.Boolean
,您必须使用 Boolean::class.javaObjectType
进行注册。
您还会发现所有原始 Java 类型都有相同的行为。
关于java - 自定义 boolean 反序列化器在 Gson 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50359877/