自定义布尔解串器在 Gson 中不起作用

int*_*_32 5 java json gson kotlin

我要反序列化0false1true

我创建了这个类:

class IntBooleanDeserializer : JsonDeserializer<Boolean?> {
    override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Boolean? {
        json?.let {
            return json.asInt == 1
        }

        return null
    }
}
Run Code Online (Sandbox Code Playgroud)

并注册它:

private val gson = GsonBuilder()
            .registerTypeAdapter(Boolean::class.java, IntBooleanDeserializer())
            .create()
Run Code Online (Sandbox Code Playgroud)

并为此创建了测试类:

data class BooleanClass(val value: Boolean?)
Run Code Online (Sandbox Code Playgroud)

进而:

gson.fromJson("{\"value\": 0}", BooleanClass::class.java)
Run Code Online (Sandbox Code Playgroud)

此代码引发异常:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a boolean but was NUMBER at line 1 column 12 path $.value
Run Code Online (Sandbox Code Playgroud)

似乎 Gson 没有将我的反序列化器用于Boolean?,但成功地将其他自定义反序列化器用于其他类型(例如,用于枚举)。

为什么?

tyn*_*ynn 8

你注册的解串器Boolean::class.javaboolean当你实际需要的类型被Boolean?翻译成java.lang.Boolean

要得到java.lang.Boolean你必须使用Boolean::class.javaObjectType注册。

您还会发现所有原始Java类型都具有相同的行为。