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

如何编写GSON自定义反序列化器兼容Int与JSON数组类型字段

GSON动态字段类型解析解决方案

1. 重构数据类结构

首先将可变类型的value字段定义为密封类,兼容Int和数组两种场景:

// 定义value的父类密封类
sealed class ValueData
// AAA类型对应的value格式
data class IntValue(val value: Int): ValueData()
// BBB类型对应的value格式,若数组内结构固定可替换为自定义数据类
data class ListValue(val value: List<Map<String, Int>>): ValueData()

// 调整原列表项数据类
data class ValueItem(
    @SerializedName("type")
    @Expose
    val type: String,
    @SerializedName("value")
    @Expose
    val value: ValueData
)

// 外层响应根类示例
data class RootResponse(
    @SerializedName("values")
    @Expose
    val values: List<ValueItem>
)

2. 编写自定义反序列化器

import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
import com.google.gson.JsonParseException
import com.google.gson.reflect.TypeToken
import java.lang.reflect.Type

class ValueItemDeserializer : JsonDeserializer<ValueItem> {
    override fun deserialize(
        json: JsonElement?,
        typeOfT: Type?,
        context: JsonDeserializationContext?
    ): ValueItem {
        val jsonObject = json?.asJsonObject ?: throw JsonParseException("JSON结构非法")
        val type = jsonObject.get("type").asString
        val valueElement = jsonObject.get("value")

        val valueData = when (type) {
            "AAA" -> IntValue(valueElement.asInt)
            "BBB" -> {
                val listType = object : TypeToken<List<Map<String, Int>>>() {}.type
                val valueList = context?.deserialize<List<Map<String, Int>>>(valueElement, listType) ?: emptyList()
                ListValue(valueList)
            }
            // 可扩展其他type的处理逻辑
            else -> throw JsonParseException("不支持的type类型:$type")
        }
        return ValueItem(type, valueData)
    }
}

3. 注册反序列化器并使用

import com.google.gson.GsonBuilder

// 构建GSON实例时注册自定义反序列化器
val gson = GsonBuilder()
    .registerTypeAdapter(ValueItem::class.java, ValueItemDeserializer())
    .create()

// 解析JSON示例
val response: RootResponse = gson.fromJson(jsonString, RootResponse::class.java)

4. 取值示例

response.values.forEach { item ->
    when (val value = item.value) {
        is IntValue -> {
            // 处理AAA类型的Int值
            val intResult = value.value
        }
        is ListValue -> {
            // 处理BBB类型的数组值
            val listResult = value.value
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:45:03