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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:48:01