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

Kotlin中如何使用Moshi处理JSON数组并正确打印嵌套列表内容

解决方案

1. 问题根因

  • 原MyData类中cars属性仅声明为无泛型的List类型,Moshi无法识别列表内元素需要解析为Car类型,会默认解析为泛型Map对象或者抛出类型匹配异常
  • 原Car类未做Moshi解析适配,未启用Kotlin反射支持的情况下会无法正常实例化
  • 直接打印未重写toString的自定义类列表,默认输出对象内存地址,不会自动打印内部item属性值

2. 修正数据类定义

调整类定义适配Moshi解析规则:

// 若使用Moshi代码生成器,添加@JsonClass注解,无需额外反射支持
@JsonClass(generateAdapter = true)
data class Car(
    @Json(name = "item")
    val item: String? = null
)

@JsonClass(generateAdapter = true)
data class MyData(
    val id: Int = 0,
    val first_name: String = "",
    val last_name: String = "",
    // 明确指定列表泛型为Car类型
    val cars: List<Car> = emptyList()
)

如果使用Moshi的Kotlin反射适配器而非代码生成,构建Moshi实例时添加KotlinJsonAdapterFactory即可,不需要加@JsonClass注解。

3. 嵌套列表解析逻辑

Moshi解析JSON数组的实现代码:

// 1. 构建Moshi实例
val moshi = Moshi.Builder()
    // 若使用反射方案添加下面这行,需要引入moshi-kotlin依赖
    // .add(KotlinJsonAdapterFactory())
    .build()

// 2. 构建List<MyData>的类型适配
val listType = Types.newParameterizedType(List::class.java, MyData::class.java)
val adapter: JsonAdapter<List<MyData>> = moshi.adapter(listType)

// 3. 执行解析,yourJsonStr替换为实际JSON字符串
val myDataList: List<MyData>? = adapter.fromJson(yourJsonStr)

4. 修正打印逻辑

调整代码提取Car的item属性拼接输出:

txtResult.text = ""
myDataList?.forEach { myData ->
    // 提取所有car的item属性拼接为字符串
    val carNames = myData.cars.joinToString { it.item ?: "未知车型" }
    txtResult.append("${myData.first_name} - ${myData.last_name} - $carNames \n")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:45:03