如何为可变数量的JSON对象创建适配Retrofit的Kotlin DTO?
解决Kotlin中动态数量Person数据的DTO适配问题
核心问题分析
你遇到的问题是API返回的JSON包含动态命名的键(person1、person2...personN),固定字段的数据类无法适配数量变化的场景,根本不需要为不同数量的Person创建不同的Persons类。
解决方案
1. 定义固定结构的Person相关数据类
先把每个Person的内部结构固定下来,因为所有person的格式是一致的:
data class Name( val name: String, val surname: String ) data class Gender( val topRank: Int, val age: Int ) data class Person( val name: Name, val gender: Gender )
2. 修改Retrofit接口的返回类型
不用自定义Persons类,直接用Map<String, Person>来接收整个JSON响应——因为JSON的顶层结构本质是一个键值对集合,键是person1、person2这类字符串,值是Person对象:
interface ExampleApi { // 假设是GET请求,根据你的实际接口方法修改 @GET("your-api-endpoint") suspend fun getPersons(): Map<String, Person> // 如果用Call的话:Call<Map<String, Person>> }
3. 转换为List(可选)
如果业务逻辑需要用List而不是Map,直接提取Map的values即可:
val personsMap = exampleApi.getPersons() val personsList = personsMap.values.toList() // 若需要按person1、person2的顺序排序,可以对Map的key排序后取值 val sortedPersonsList = personsMap.keys.sorted() .map { key -> personsMap[key]!! }
4. 保留原Retrofit配置
你的Retrofit构建代码不需要修改,Gson默认支持将这种动态键的JSON解析为Map类型。
验证示例
针对你给出的JSON响应,Gson会自动把它解析为一个包含两个键("person1"、"person2")的Map,每个键对应的值是Person对象,完全适配任意数量的Person返回结果。
内容的提问来源于stack exchange,提问作者Mustafa İnan
相关产品推荐
相关产品推荐

