如何在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
相关产品推荐
相关产品推荐

