我必须将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?
,而是成功地将其他自定义反序列化器用于其他类型(例如,用于枚举)。
为什么?
2条答案
按热度按时间cvxl0en21#
您正在为
Boolean::class.java
注册反序列化器,它是boolean
,而实际上您需要的类型是Boolean?
,它将转换为java.lang.Boolean
。要获得
java.lang.Boolean
,您必须使用Boolean::class.javaObjectType
进行注册。您还会发现所有原始 Java 类型都有相同的行为。
x4shl7ld2#
受@tynn的答案和这个post的启发,我设计了两个
TypeAdater
来覆盖Kotlin中的Boolean
和Boolean?
类型。您可以通过以下方式注册这些适配器
我还创建了一个gist来保存这些并编写测试。