Android Kotlin如何解析动态增长的JSON对象集合
如何实现JSON对象到Kotlin数据结构的转换?
待转换的JSON格式示例
"company": { "54": { "id": "54", "type": "metan", "region_name": "Urganch shahri", "open_close": 1, "name": "Xorazm IDEAL GAZ", "image": "https://metan.mbos.uz/persons/145787891644148634.jpg", "start_time": "00:00", "end_time": "23:59", "price": "2600", "orientr": "Obl.GAI ko'prik o'ng tomonida", "googlemap": "https://maps.google.com/maps?q=41.530320,60.649560&ll=41.530320,60.649560&z=16" }, "56": { "id": "56", "type": "metan", "region_name": "Xonqa tumani", "open_close": 1, "name": "Shaxzodbek Sulaymon", "image": "https://metan.mbos.uz/persons/5634558381644152414.jpg", "start_time": "00:00", "end_time": "23:59", "price": "2500", "orientr": "Oxunbabayev. ShoxOil", "googlemap": "https://maps.google.com/maps?q=41.491009,60.748586&ll=41.491009,60.748586&z=16" }, // 持续动态新增57、58、59、60...等ID对应的子对象 }
- 核心问题:该JSON结构下的子对象数量会动态持续增长,对象键为不固定的数字ID。
可行解决方案
这类动态键值对结构的JSON,不要硬编码固定ID作为数据类字段,直接用Kotlin的Map类型承接动态键部分即可,无论后续新增多少子对象都不需要修改数据结构定义,主流Kotlin JSON序列化库均原生支持该映射逻辑。
具体实现步骤
- 先定义单条站点信息的数据类,对应每个动态ID下固定结构的字段:
// 示例以kotlinx.serialization库为例,Gson/Moshi可去掉相关注解 import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable data class GasStation( val id: String, val type: String, @SerialName("region_name") val regionName: String, @SerialName("open_close") val openClose: Int, val name: String, val image: String, @SerialName("start_time") val startTime: String, @SerialName("end_time") val endTime: String, val price: String, val orientr: String, val googlemap: String )
- 定义外层接收结构,将
company字段声明为Map类型,键为ID类型(String/Int/Long均可,序列化库会自动转换),值为上面定义的GasStation:
@Serializable data class ApiResponse( // 动态ID部分全部由Map承接,新增子项无需修改代码 val company: Map<String, GasStation> )
不同序列化库适配说明
- 用Gson的场景:不需要额外注解,直接声明
Map<String, GasStation>或者Map<Long, GasStation>即可正常解析,库会自动完成数字键到Map键的转换 - 用Moshi的场景:原生支持Map与JSON对象的映射,无需自定义适配器
- 用kotlinx.serialization的场景:默认支持Map类型序列化/反序列化,若需要用数字类型作为键,直接将Map键类型声明为Int/Long即可
使用提示:解析完成后,调用
company.values即可获取所有站点的列表集合,调用company["54"]即可按ID取出对应站点对象,使用体验和固定字段的数据类完全一致。
内容的提问来源于stack exchange,提问作者Nurmuhammad Qadamboyev
相关产品推荐
相关产品推荐

