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

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序列化库均原生支持该映射逻辑。

具体实现步骤

  1. 先定义单条站点信息的数据类,对应每个动态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
)
  1. 定义外层接收结构,将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:21:36