Retrofit中Kotlin如何编写适配动态日期键的数据类
解决方案
核心思路
JSON中list字段是动态日期字符串为键、症状列表数组为值的结构,Kotlin中直接用Map<String, List<SymptomList>>适配即可,无需逐个定义日期字段。Retrofit配合Gson/Moshi等序列化库时,天然支持这种动态键的Map结构。
步骤1:定义基础数据类
先把单个症状列表的结构SymptomList定义好(根据实际JSON字段调整):
data class SymptomList( val symptomName: String, val severity: Int, val duration: String // 补充其他症状相关字段 )
步骤2:定义外层数据类
包含list字段,类型用Map<String, List<SymptomList>>(键用String是因为JSON中的日期以字符串格式存储,后续可自行转换为LocalDate/Date):
data class ResponseData( val list: Map<String, List<SymptomList>> // 若有其他顶层字段(如code、message)可在此补充 )
关键注意点
- 不要用
MutableMap:Retrofit默认的序列化库(Gson/Moshi)会自动将JSON动态键值对解析为不可变Map,使用MutableMap反而可能导致解析失败,因为序列化库不会主动生成可变集合实例。 - 日期键转换:如果需要将字符串日期转为
LocalDate,可在拿到Map后遍历处理,示例:val dateSymptomMap = responseData.list.mapKeys { LocalDate.parse(it.key) } - 避免误用
Dictionary:Dictionary是Java过时类,Kotlin中直接用Map即可,更符合现代Kotlin编程习惯。
Retrofit接口示例
定义对应接口,返回上述ResponseData:
interface SymptomApi { @GET("symptoms") suspend fun getSymptoms(): Response<ResponseData> }
这样无论后续新增多少日期键,数据类都能自动适配,无需修改代码,扩展性拉满。
内容的提问来源于stack exchange,提问作者Harvey Xie
相关产品推荐
相关产品推荐

