如何构建无外层字段的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
相关产品推荐
相关产品推荐

