我如何使用GSON库和Kotlin为CHAR类型进行自定义编码/解码?我当前的代码不工作,它不停止调试。出现类型不匹配。我的代码:第一个有人能帮我吗?我尝试了上面的一个示例代码,并在github gson存储库中搜索了infos。
flvlnr441#
问题是Java中有两种不同的类型表示字符,char是基本类型,Character是 Package 器。Kotlin类型Char可以Map到其中任何一种,这取决于字段是否可以为空。因此,您必须同时Map两种类型。docs在registerTypeAdapter方法中也提到了这一点。这将注册指定的类型,而不注册其他类型:您必须手动注册相关的类型!例如,注册boolean.class的应用程序也应该注册Boolean.class。在您的情况下,这意味着您需要为Char::class.java和Character::class.java注册串行化程序和反串行化程序:
char
Character
Char
registerTypeAdapter
Char::class.java
Character::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。通过一些重构,我们可以通过以下方式简化这一过程:
JsonDeserializer
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() }
1条答案
按热度按时间flvlnr441#
问题是Java中有两种不同的类型表示字符,
char
是基本类型,Character
是 Package 器。Kotlin类型Char
可以Map到其中任何一种,这取决于字段是否可以为空。因此,您必须同时Map两种类型。docs在registerTypeAdapter
方法中也提到了这一点。这将注册指定的类型,而不注册其他类型:您必须手动注册相关的类型!例如,注册boolean.class的应用程序也应该注册Boolean.class。
在您的情况下,这意味着您需要为
Char::class.java
和Character::class.java
注册串行化程序和反串行化程序:另外,请注意
JsonDeserializer
的实现,null
必须在catch内,否则,它将始终返回null
。通过一些重构,我们可以通过以下方式简化这一过程: