You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

处理混合类型JSON的反序列化方案

给定如下混合类型的JSON结构:

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

这类数组同时包含字符串和对象数组,不像全字符串或同类型对象数组那样易于反序列化,且无法修改原始JSON格式。

可行解决方案

经过多种尝试后,我选择将原JSON转换为更易处理的结构:把数组第一个元素(字符串)作为tag字段,第二个元素(对象数组)作为data字段。

1. 定义目标数据类

先定义对应转换后结构的序列化数据类:

@Serializable
data class ListItem(
    val tag: String,
    val data: List<Data>,
)

@Serializable
data class Data(
    val key: String,
)

2. 自定义转换序列化器

通过JsonTransformingSerializer在反序列化阶段重新排列JSON结构:

object ListItemSerializer : JsonTransformingSerializer<List<ListItem>>(
    ListSerializer(ListItem.serializer())
) {
    override fun transformDeserialize(element: JsonElement): JsonElement {
        return buildJsonArray {
            addJsonObject {
                // 注:实际业务场景中不要硬编码索引做假设
                put("tag", element.jsonArray[0])
                put("data", element.jsonArray[1])
            }
        }
    }
}

3. 验证反序列化结果

编写代码验证转换逻辑是否正确:

val string = """
    [
        "text",
        [
            {
                "key":"value"
            }
        ]
    ]
    """.trimMargin()

val listFromString = Json.decodeFromString(ListItemSerializer, string)
val list = listOf(
    ListItem(
        tag = "text",
        data = listOf(
            Data(key = "value")
        )
    )
)
assertEquals(list, listFromString)

内容的提问来源于stack exchange,提问作者solamour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:52:51