我正在尝试将此Java示例转换为Kotlin:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Boolean.class, new JsonStrictBooleanDeserializer())
.registerTypeAdapter(boolean.class, new JsonStrictBooleanDeserializer())
.create();
val gson = GsonBuilder()
.registerTypeAdapter(Boolean::class.java, JsonStrictBooleanDeserializer())
.registerTypeAdapter(Boolean::class.javaPrimitiveType, JsonStrictBooleanDeserializer())
.create()
但是,它们的行为似乎并不相同。我反编译了 Kotlin 示例,似乎只注册了一个类型适配器:
(new GsonBuilder())
.registerTypeAdapter((Type)Boolean.TYPE, new JsonStrictBooleanDeserializer())
.registerTypeAdapter((Type)Boolean.TYPE, new JsonStrictBooleanDeserializer())
.create();
在 Kotlin 中为盒装布尔值和原始布尔值注册类型适配器的正确方法是什么?
您拥有的Boolean
类的两种用法都被编译为基元布尔类型。除了javaPrimitiveType
之外,您还需要使用javaObjectType
,如下所示:
val gson = GsonBuilder()
.registerTypeAdapter(Boolean::class.javaObjectType, JsonStrictBooleanDeserializer())
.registerTypeAdapter(Boolean::class.javaPrimitiveType, JsonStrictBooleanDeserializer())
.create()
这将导致第一次调用使用Boolean.class
,第二次调用使用Boolean.TYPE
(基元boolean
的Class
(。