使用 Kotlin 序列化反序列化 JSON 数组中的混合对象

问题描述 投票:0回答:1

以下 JSON 是一个字符串数组和一个对象数组(具有键和值)。给定数组中的这些异构项类型,如何使用 Kotlin 序列化对其进行反序列化?

[
    "text",
    [
        {
            "key":"value"
        }
    ]
]

如果所有项目都是同一类型(即所有字符串或同类对象),那会很容易,但我无法控制格式。

json kotlin serialization mixed
1个回答
0
投票

试试这个。

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}")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.