如何使用Kotlin将CHAR类型编码/解码为GSON中的数字?

vojdkbi0  于 2022-11-06  发布在  Kotlin
关注(0)|答案(1)|浏览(194)

我如何使用GSON库和Kotlin为CHAR类型进行自定义编码/解码?
我当前的代码不工作,它不停止调试。
出现类型不匹配。
我的代码:
第一个
有人能帮我吗?
我尝试了上面的一个示例代码,并在github gson存储库中搜索了infos。

flvlnr44

flvlnr441#

问题是Java中有两种不同的类型表示字符,char是基本类型,Character是 Package 器。Kotlin类型Char可以Map到其中任何一种,这取决于字段是否可以为空。因此,您必须同时Map两种类型。docs在registerTypeAdapter方法中也提到了这一点。
这将注册指定的类型,而不注册其他类型:您必须手动注册相关的类型!例如,注册boolean.class的应用程序也应该注册Boolean.class。
在您的情况下,这意味着您需要为Char::class.javaCharacter::class.java注册串行化程序和反串行化程序:

private fun createGson(): Gson {
    val builder = GsonBuilder()

    builder.registerTypeAdapter(
        Char::class.java,
        JsonDeserializer<Any?> { json, _, _ ->
            try {
                Char(json.asJsonPrimitive.asInt)
            } catch (e: Exception) {
                null
            }
        },
    )
    builder.registerTypeAdapter(
        Character::class.java,
        JsonDeserializer<Any?> { json, _, _ ->
            try {
                Char(json.asJsonPrimitive.asInt)
            } catch (e: Exception) {
                null
            }
        },
    )
    builder.registerTypeAdapter(
        Char::class.java,
        JsonSerializer<Char?> { value, _, _ ->
            JsonPrimitive(value.code)
        },
    )
    builder.registerTypeAdapter(
        Character::class.java,
        JsonSerializer<Char?> { value, _, _ ->
            JsonPrimitive(value.code)
        },
    )

    return builder.create()
}

另外,请注意JsonDeserializer的实现,null必须在catch内,否则,它将始终返回null
通过一些重构,我们可以通过以下方式简化这一过程:

private fun createGson(): Gson {
    val builder = GsonBuilder()

    val customCharSerializer = object : JsonDeserializer<Any?>, JsonSerializer<Char?> {
        override fun deserialize(json: JsonElement, typeOfT: Type?, context: JsonDeserializationContext?): Any? {
            return try {
                Char(json.asJsonPrimitive.asInt)
            } catch (e: Exception) {
                null
            }
        }

        override fun serialize(src: Char?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement? {
            return src?.let { JsonPrimitive(it.code) }
        }
    }

    builder.registerTypeAdapter(Char::class.java, customCharSerializer,)
    builder.registerTypeAdapter(Character::class.java, customCharSerializer,)

    return builder.create()
}

相关问题