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,