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

如何构建无外层字段的Android API响应Data Class及继承基类

解决方案

1. 先定义数组内的实体类

把接口返回数组中的单个对象,单独定义为一个可序列化的Data Class:

data class User(
    val name: String,
    val age: Int,
    val address: String
) : Serializable

2. 适配带基类的响应结构

假设你的Serializable基类是这样的(包含status和description字段):

open class BaseResponse(
    open val status: Int? = null,
    open val description: String? = null
) : Serializable

针对这个直接返回数组的特殊接口,有两种可行的适配思路:

思路一:包装类继承基类并持有数组

定义一个继承自BaseResponse的响应类,内部用字段存储数组数据:

data class UserListResponse(
    val userList: List<User>
) : BaseResponse()

因为接口本身不返回status和description,解析时需要手动赋值这两个字段:

// 示例:用Gson解析接口返回的数组字符串
val rawJson = apiService.fetchUserList()
val parsedUserList = Gson().fromJson(rawJson, object : TypeToken<List<User>>() {}.type)
// 构造响应类并手动设置状态字段
val finalResponse = UserListResponse(parsedUserList).apply {
    status = 200
    description = "请求成功"
}

思路二:响应类继承基类并委托List接口

让响应类同时具备BaseResponse的属性和List的行为,通过委托实现:

data class UserListResponse(
    override val status: Int?,
    override val description: String?,
    private val delegateList: List<User>
) : BaseResponse(status, description), List<User> by delegateList

这种方式下,你可以直接像操作普通List一样使用UserListResponse,同时保留基类的状态字段:

val parsedUserList = Gson().fromJson(rawJson, object : TypeToken<List<User>>() {}.type)
val finalResponse = UserListResponse(200, "请求成功", parsedUserList)
// 直接遍历响应类
for (user in finalResponse) {
    println(user.name)
}

3. 网络框架适配提示

如果用Retrofit这类网络框架,需要把接口方法的返回泛型设为List<User>,拿到数组结果后再包装成你需要的继承基类的响应类,因为框架默认无法直接将纯数组解析为带外层字段的对象。

内容的提问来源于stack exchange,提问作者iSofia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:21:34