以下 JSON 是一个字符串数组和一个对象数组(具有键和值)。给定数组中的这些异构项类型,如何使用 Kotlin 序列化对其进行反序列化?
[
"text",
[
{
"key":"value"
}
]
]
如果所有项目都是同一类型(即所有字符串或同类对象),那会很容易,但我无法控制格式。
试试这个。
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable(with = ItemSerializer::class)
sealed class Item
@Serializable
data class StringItem(val value: String) : Item()
@Serializable
data class ObjectItem(val key: String, val value: String) : Item()
object ItemSerializer : JsonContentPolymorphicSerializer<Item>(Item::class) {
override fun selectDeserializer(element: JsonElement): DeserializationStrategy<out Item> {
return when {
element is JsonPrimitive && element.isString -> StringItem.serializer()
element is JsonObject && element.keys.contains("key") -> ObjectItem.serializer()
else -> throw SerializationException("Unknown item type")
}
}
}
fun main() {
val json = """
[
"text",
[
{
"key":"value"
}
]
]
""".trimIndent()
val items = Json.decodeFromString<List<Item>>(json)
items.forEach {
when (it) {
is StringItem -> println("String: ${it.value}")
is ObjectItem -> println("Object: ${it.key} -> ${it.value}")
}
}
}