java - 自定义 boolean 反序列化器在 Gson 中不起作用

标签 java json kotlin gson

我必须将 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/

相关文章:

java - 一些听众没有开火

ruby-on-rails - ActionView::MissingTemplate,带有 JSON 的 Rails 5 API

c# - JObject 结构 - 如何迭代?

android - 如何在 Android 上将 UTC 日期转换为语言环境 GMT 时间

具有未指定返回类型的 Kotlin 函数

java - 使用Maven在hadoop-cluster上运行Java程序

java - 除了超时或 session.invalidate() 以外,JSP Web session 被重置的原因是什么?

java - 通过ajax发送JSON并在JSP中通过请求获取参数

android - Kotlin OnTouchListener 已调用,但未覆盖 performClick

java - 什么时候在 Java/Gradle 中使用运行时而不是编译时依赖?