如何使用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
相关产品推荐
相关产品推荐

