新手替换Gson为Moshi:如何将UiGeneralCategory转为JSON字符串?
用Moshi处理含集合的模型类转JSON字符串
1. 替换模型中的ArrayList为Kotlin标准集合
Moshi对Kotlin原生集合的支持更友好,建议把模型里的ArrayList替换为MutableList(需要修改集合内容时)或List(仅只读场景):
原模型示例:
class UiGeneralCategory { var items: ArrayList<SomeItem> = ArrayList() // 其他字段... }
替换后:
class UiGeneralCategory { // 可变集合,支持增删操作 var items: MutableList<SomeItem> = mutableListOf() // 或只读集合(推荐用于不需要修改的场景) // val items: List<SomeItem> = emptyList() }
如果一定要保留ArrayList,Moshi也能兼容,但Kotlin标准集合写法更简洁且符合语言习惯。
2. 生成适配器并序列化模型
你之前找到的适配器写法完全适用于带集合的模型,直接复用即可,完整示例代码:
// 初始化Moshi实例 val moshi = Moshi.Builder().build() // 获取UiGeneralCategory的JSON适配器 val jsonAdapter: JsonAdapter<UiGeneralCategory> = moshi.adapter(UiGeneralCategory::class.java) // 构建测试用的模型对象 val testCategory = UiGeneralCategory().apply { items.add(SomeItem("测试项1")) items.add(SomeItem("测试项2")) // 给其他字段赋值... } // 转换为JSON字符串 val jsonString = jsonAdapter.toJson(testCategory) // 输出验证结果 println(jsonString)
3. 关键测试点
- 集合内容验证:检查生成的JSON中
items字段是否为数组格式,且包含所有添加的元素值 - 空集合场景:将
items设为emptyList()或mutableListOf(),确认JSON中对应字段输出为[]而非null - 反序列化校验(可选):验证JSON字符串能否正确转回模型对象,集合内容是否完整:
val parsedCategory = jsonAdapter.fromJson(jsonString) println(parsedCategory?.items?.size) // 应输出2,与测试时添加的元素数量一致
4. 常见问题处理
如果集合元素是自定义类(比如示例中的SomeItem),需要给该类添加Moshi注解以生成适配器:
@JsonClass(generateAdapter = true) class SomeItem(val name: String)
如果是Kotlin数据类,Moshi默认可以自动处理,但普通类必须添加上述注解。
内容的提问来源于stack exchange,提问作者Vlad.mir
相关产品推荐
相关产品推荐

