如何在Android Studio中用Retrofit 2访问嵌套JSON的players数组内player对象
基于Retrofit 2 + Gson的嵌套JSON反序列化实现方案
1. 先添加项目依赖
在模块级build.gradle的dependencies节点添加以下依赖(可根据项目情况调整版本号):
// Retrofit 核心依赖 implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Gson 数据转换器 implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson 核心依赖(如果未被自动引入可手动添加) implementation 'com.google.code.gson:gson:2.10.1'
2. 定义匹配JSON结构的实体类
以下用Kotlin data class演示,Java写法逻辑一致:
// 最外层响应实体 data class PlayerRootResponse( val api: ApiData ) // api字段对应的内层实体 data class ApiData( val status: Int, val message: String, val results: Int, // 不需要用到的字段可以省略不写,Gson会自动忽略 val players: List<Player> ) // players数组对应的单个球员实体 data class Player( val firstName: String, val lastName: String, val teamId: String, val yearsPro: String, val collegeName: String, val leagues: Leagues ) // leagues字段对应的实体 data class Leagues( val standard: StandardLeague ) // standard联赛信息实体 data class StandardLeague( val jersey: String, val active: String, val pos: String )
如果需要自定义实体类字段名和JSON字段做映射,可以给对应字段加@SerializedName("JSON中对应的字段名")注解。
3. 初始化Retrofit实例
val gson = GsonBuilder() // 可按需配置,比如处理null值、日期格式等 .create() val retrofit = Retrofit.Builder() .baseUrl("替换为你的API服务根地址") .addConverterFactory(GsonConverterFactory.create(gson)) .build()
4. 定义API请求接口
interface PlayerApiService { // 替换为实际的接口路径,这里演示带playerId路径参数的请求 @GET("players/playerId/{id}") fun getPlayerById(@Path("id") playerId: Int): Call<PlayerRootResponse> }
5. 发起请求并获取players列表
// 初始化接口服务实例 val apiService = retrofit.create(PlayerApiService::class.java) // 发起异步请求 apiService.getPlayerById(44).enqueue(object : Callback<PlayerRootResponse> { override fun onResponse(call: Call<PlayerRootResponse>, response: Response<PlayerRootResponse>) { if (response.isSuccessful) { val rootData = response.body() // 直接获取players列表,做判空处理避免空指针 val playerList = rootData?.api?.players ?: emptyList() // 拿到列表后可直接做后续业务处理 if (playerList.isNotEmpty()) { val targetPlayer = playerList[0] Log.d("PlayerInfo", "球员姓名:${targetPlayer.firstName} ${targetPlayer.lastName}") } } else { // 处理请求错误逻辑 } } override fun onFailure(call: Call<PlayerRootResponse>, t: Throwable) { // 处理网络异常逻辑 } })
注意事项
- JSON中的数字类字段比如
teamId是字符串类型(带双引号),实体类对应字段请定义为String类型,不要用Int否则会触发解析错误 - 不需要使用的字段(比如示例中的filters)不用在实体类中定义,Gson会自动忽略未声明的JSON字段
- 如果接口返回字段可能为null,可以在GsonBuilder中开启
serializeNulls()配置
内容的提问来源于stack exchange,提问作者ismail M
相关产品推荐
相关产品推荐

