Retrofit中解析嵌套数组结构JSON map的数据类定义方法
解决方案
你返回的map字段本质是嵌套数组结构:外层是数组,每一个子数组固定包含2个元素,第一个为Int类型的标识,第二个为String类型的描述。
方案1:快速实现(不需要额外配置)
直接定义为嵌套List类型即可,注意类名不要使用Map,避免和Kotlin标准库的集合类重名产生歧义:
data class RelativeResponse( @SerializedName("map") val map : List<List<Any>> )
注意:该方案取值时需要手动做类型转换,比如
map[0][0] as Int、map[0][1] as String,存在类型转换异常的风险,仅适合临时快速调试使用。
方案2:类型安全实现(推荐)
通过自定义数据类+序列化适配器的方式处理,后续无需类型转换,稳定性更高。
- 首先定义子项对应的数据类:
data class RelativeItem( val id: Int, val desc: String )
- 定义外层响应类:
data class RelativeResponse( @SerializedName("map") val map: List<RelativeItem> )
- 为Gson注册自定义TypeAdapter,实现数组转
RelativeItem的反序列化逻辑:
class RelativeItemAdapter : TypeAdapter<RelativeItem>() { override fun write(out: JsonWriter, value: RelativeItem?) { value?.run { out.beginArray() out.value(id) out.value(desc) out.endArray() } } override fun read(`in`: JsonReader): RelativeItem { `in`.beginArray() val id = `in`.nextInt() val desc = `in`.nextString() `in`.endArray() return RelativeItem(id, desc) } }
- 构建Gson实例时注册适配器即可正常解析:
val gson = GsonBuilder() .registerTypeAdapter(RelativeItem::class.java, RelativeItemAdapter()) .create()
如果你使用的是Kotlinx Serialization序列化库,无需自定义适配器,直接声明为List<Pair<Int, String>>即可:
@Serializable data class RelativeResponse( @SerialName("map") val map: List<Pair<Int, String>> )
内容的提问来源于stack exchange,提问作者abhie
相关产品推荐
相关产品推荐

