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

如何为可变数量的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:58