问题描述
我有以下数据类
@Serializable
data class TestClass(
val id: Int,val content: String)
并遵循可能的 JSON
{"id" = "1","content": "1" }
{"id" = "2","content": {"subcontent1": "subvalue1"} }
{"id" = "3","content": {"subcontent2": "subvalue2"} }
内容的确切结构未知,可能会发生变化。是否可以将此类 json 反序列化为 TestClass ?
如果我使用
Json {
ignoreUnkNownKeys = true
isLenient = true
}.decodeFromString<TestClass>(inputJsonString)
我收到以下异常
在偏移量 122 处出现意外的 JSON 标记:预期的字符串或非空文字
您能否就克服此问题的最佳方法提供任何想法?
我必须编写自定义序列化程序还是可以更轻松地完成?
解决方法
我已经找到了问题的答案。
需要实现自定义序列化器
object AnyToStringSerializer : KSerializer<String> {
override fun deserialize(decoder: Decoder): String {
val jsonInput = decoder as? JsonDecoder ?: error("Can be deserialized only by JSON")
val json = jsonInput.decodeJsonElement().jsonObject.toString()
return json
}
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("anyString",PrimitiveKind.STRING)
override fun serialize(encoder: Encoder,value: String) {
val jsonElement = Json.parseToJsonElement(value)
val jsonEncoder = encoder as? JsonEncoder ?: error("Can be deserialized only by JSON")
jsonEncoder.encodeJsonElement(jsonElement)
}
}
然后将它用于你想成为原始字符串的字段
@SerialName("x")
@Serializable(with = AnyToStringSerializer::class)
val X: String,