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
相关产品推荐
相关产品推荐

