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

