如何为含动态日期键的近地天体JSON创建Kotlin Data Class
如何为带动态日期键的JSON创建Kotlin数据类?
首先看你提供的JSON结构:
{ "element_count": 25, "near_earth_objects": { "2015-09-08": [{ "id": "2465633", "neo_reference_id": "2465633", "name": "465633 (2009 JR5)", "nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=2465633", "absolute_magnitude_h": 20.36, "estimated_diameter": { ... }, "is_potentially_hazardous_asteroid": true, "close_approach_data": [{ "close_approach_date": "2015-09-08", "close_approach_date_full": "2015-Sep-08 20:28", "epoch_date_close_approach": 1441744080000, "relative_velocity": { ... }, "miss_distance": { ... }, "orbiting_body": "Earth" }], "is_sentry_object": false } ], "2015-09-07": [{ "id": "2440012", "neo_reference_id": "2440012", "name": "440012 (2002 LE27)", "nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=2440012", "absolute_magnitude_h": 19.3, "estimated_diameter": { }, "is_potentially_hazardous_asteroid": false, "close_approach_data": [{ "close_approach_date": "2015-09-07", "miss_distance": { }, "orbiting_body": "Earth" }], "is_sentry_object": false } ] } }
核心解决方案:用Map处理动态键
near_earth_objects里的键是动态日期字符串,对应的值是近地天体列表,在Kotlin中直接用Map<String, List<NearEarthObject>>定义这个字段即可,主流JSON解析库(Gson、Moshi、Jackson)都支持这种类型的自动解析。
完整数据类定义
// 顶层响应类 data class NeoResponse( val element_count: Int, val near_earth_objects: Map<String, List<NearEarthObject>> ) // 近地天体类 data class NearEarthObject( val id: String, val neo_reference_id: String, val name: String, val nasa_jpl_url: String, val absolute_magnitude_h: Double, val estimated_diameter: EstimatedDiameter, val is_potentially_hazardous_asteroid: Boolean, val close_approach_data: List<CloseApproachData>, val is_sentry_object: Boolean ) // 直径数据类(根据实际JSON字段补全) data class EstimatedDiameter( val kilometers: DiameterValue, val meters: DiameterValue, val miles: DiameterValue, val feet: DiameterValue ) data class DiameterValue( val estimated_diameter_min: Double, val estimated_diameter_max: Double ) // 近距离接近数据类 data class CloseApproachData( val close_approach_date: String, val close_approach_date_full: String?, // 可选字段,根据实际是否为空调整 val epoch_date_close_approach: Long?, val relative_velocity: RelativeVelocity, val miss_distance: MissDistance, val orbiting_body: String ) // 相对速度数据类 data class RelativeVelocity( val kilometers_per_second: String, val kilometers_per_hour: String, val miles_per_hour: String ) // 距离数据类 data class MissDistance( val astronomical: String, val lunar: String, val kilometers: String, val miles: String )
如何获取动态日期和对应数据
解析完成后,通过遍历near_earth_objects的条目就能获取所有日期和对应的天体列表:
val response: NeoResponse = // 解析后的响应对象 // 遍历所有日期和天体列表 for ((date, neoList) in response.near_earth_objects) { println("日期:$date") neoList.forEach { neo -> println("天体名称:${neo.name},是否危险:${neo.is_potentially_hazardous_asteroid}") } } // 获取所有日期集合 val allDates = response.near_earth_objects.keys // 获取指定日期的天体列表 val targetDateNeoList = response.near_earth_objects["2015-09-08"]
注意事项
- 字段的可空性(
?)根据实际JSON返回情况调整,若某些字段可能缺失,就标记为可空类型。 - 使用Gson需添加Kotlin支持依赖;使用Moshi需添加
moshi-kotlin依赖,确保数据类解析顺畅。
内容的提问来源于stack exchange,提问作者Saneen K P
相关产品推荐
相关产品推荐

