如何为 boolean.class/Boolean::class.javaPrimitiveType 和 Boolean.class/Boolean.class.java 注册类型适配器

ord*_*lex 3 code-conversion gson kotlin

我正在尝试将此 Java 示例转换为 Kotlin:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Boolean.class, new JsonStrictBooleanDeserializer())
        .registerTypeAdapter(boolean.class, new JsonStrictBooleanDeserializer())
        .create();
Run Code Online (Sandbox Code Playgroud)
val gson = GsonBuilder()
        .registerTypeAdapter(Boolean::class.java, JsonStrictBooleanDeserializer())
        .registerTypeAdapter(Boolean::class.javaPrimitiveType, JsonStrictBooleanDeserializer())
        .create()
Run Code Online (Sandbox Code Playgroud)

但是,它们的行为似乎并不相同。我反编译了 Kotlin 示例,似乎只注册了一种类型的适配器:

(new GsonBuilder())
        .registerTypeAdapter((Type)Boolean.TYPE, new JsonStrictBooleanDeserializer())
        .registerTypeAdapter((Type)Boolean.TYPE, new JsonStrictBooleanDeserializer())
        .create();
Run Code Online (Sandbox Code Playgroud)

在 Kotlin 中为装箱和原始布尔值注册类型适配器的正确方法是什么?

ape*_*lla 7

Boolean您拥有的类的两种用途都被编译为原始布尔类型。javaObjectType除了 之外javaPrimitiveType,您还需要使用,如下所示:

val gson = GsonBuilder()
        .registerTypeAdapter(Boolean::class.javaObjectType, JsonStrictBooleanDeserializer())
        .registerTypeAdapter(Boolean::class.javaPrimitiveType, JsonStrictBooleanDeserializer())
        .create()
Run Code Online (Sandbox Code Playgroud)

这将导致第一个调用 usingBoolean.class和第二个 using Boolean.TYPEClass用于原语boolean)。