kotlinx.serialization 具体案例的问题
kotlinx.serialization question for specific case
我有以下数据class
@Serializable
data class TestClass(
val id: Int,
val content: String)
和以下可能的 JSONs
{"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,
我有以下数据class
@Serializable
data class TestClass(
val id: Int,
val content: String)
和以下可能的 JSONs
{"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,