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

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:类型安全实现(推荐)

通过自定义数据类+序列化适配器的方式处理,后续无需类型转换,稳定性更高。

  1. 首先定义子项对应的数据类:
data class RelativeItem(
    val id: Int,
    val desc: String
)
  1. 定义外层响应类:
data class RelativeResponse(
    @SerializedName("map")
    val map: List<RelativeItem>
)
  1. 为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)
    }
}
  1. 构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:27:03