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

如何在Kotlin中通过指定Key解析Retrofit 2响应

在Kotlin中结合Retrofit2解析JSON生成Warehouse列表

我正在尝试解析ResponseBody中的JSON对象,需要创建一个由Warehouse对象组成的WarehouseList数组。

响应JSON:

{
    "GetUserWarehouseListResult": [
        {
            "Message": null,
            "WarehouseId": 31232,
            "WarehouseName": "ABQ"
        },
        {
            "Message": null,
            "WarehouseId": 22113,
            "WarehouseName": "AMS"
        },
        {
            "Message": null,
            "WarehouseId": 21645,
            "WarehouseName": "ORD"
        }
    ]
}

Objective-C实现方式:

for (NSDictionary* element in [dictionary objectforKey:@"GetUserWarehouseListResult"]) {
    // 处理每个仓库对象
}

Kotlin结合Retrofit2的实现方案

步骤1:定义对应的数据类

创建与JSON结构匹配的数据类,让Retrofit自动完成解析:

// 外层响应数据类,对应整个JSON对象
data class WarehouseResponse(
    val GetUserWarehouseListResult: List<Warehouse>
)

// 仓库实体类,对应数组中的每个元素
data class Warehouse(
    val Message: String?,
    val WarehouseId: Int,
    val WarehouseName: String
)

步骤2:配置Retrofit接口

将接口中的Call<ResponseBody>替换为Call<WarehouseResponse>,同时确保已添加Gson转换器依赖(在build.gradle中):

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

步骤3:处理响应结果

修改onResponse方法,直接获取解析后的仓库列表:

override fun onResponse(call: Call<WarehouseResponse>, response: Response<WarehouseResponse>) {
    if (response.isSuccessful) {
        val warehouseList = response.body()?.GetUserWarehouseListResult
        warehouseList?.forEach { warehouse ->
            // 这里处理每个Warehouse对象,比如打印信息或存入数组
            Log.d(TAG, "仓库ID: ${warehouse.WarehouseId}, 仓库名称: ${warehouse.WarehouseName}")
        }
    } else {
        Log.e(TAG, "请求失败,状态码: ${response.code()}")
    }
}

手动解析ResponseBody(可选)

如果不想用Retrofit自动解析,也可以用Gson手动解析字符串:

override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
    val stringResponse = response.body()?.string()
    stringResponse?.let {
        val gson = Gson()
        val warehouseResponse = gson.fromJson(it, WarehouseResponse::class.java)
        val warehouseList = warehouseResponse.GetUserWarehouseListResult
        
        warehouseList.forEach { warehouse ->
            Log.d(TAG, "仓库ID: ${warehouse.WarehouseId}, 仓库名称: ${warehouse.WarehouseName}")
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:30:44