
本文详解如何使用 Retrofit + Gson 在 Android 中解析含多层嵌套结构(如 data 内含 recipients 数组)的 JSON 响应,并安全获取 msg、request_status、number 和 status 等关键字段。
本文详解如何使用 retrofit + gson 在 android 中解析含多层嵌套结构(如 `data` 内含 `recipients` 数组)的 json 响应,并安全获取 `msg`、`request_status`、`number` 和 `status` 等关键字段。
在 Android 开发中,调用 REST API 返回的 JSON 常包含多层嵌套对象(如 data 下嵌套 recipients 数组),直接用 JSONObject 或手动遍历易出错且难以维护。推荐采用 Retrofit + Gson + 数据类建模 的方式实现类型安全、可读性强的解析。
✅ 正确建模嵌套结构(Kotlin 示例)
首先,根据 JSON 结构定义对应的数据类(推荐使用 Kotlin,Java 同理需补充 getter/setter):
// 顶层响应结构
data class ApiResponse(
val error: Int,
val msg: String,
val data: DataItem
)
// data 字段对应的对象
data class DataItem(
val request_id: Long,
val request_status: String,
val request_charge: String,
val recipients: List<recipient>
)
// recipients 数组中的每个元素
data class Recipient(
val number: String,
val charge: String,
val status: String
)</recipient>
⚠️ 注意:字段名若含下划线(如 request_status),Gson 默认无法自动匹配驼峰命名。需在 build.gradle 中配置 Gson converter factory 并启用 FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES,或使用 @SerializedName 注解:
data class DataItem(
@SerializedName("request_id") val requestId: Long,
@SerializedName("request_status") val requestStatus: String,
@SerializedName("request_charge") val requestCharge: String,
@SerializedName("recipients") val recipients: List<recipient>
)</recipient>
✅ Retrofit 接口定义与调用
interface ApiService {
@GET("your/endpoint")
suspend fun fetchResponse(): Response<apiresponse>
}
// 调用示例(协程中)
try {
val response = apiService.fetchResponse()
if (response.isSuccessful && response.body() != null) {
val apiResponse = response.body()!!
// 提取所需字段
val message = apiResponse.msg // "Success"
val status = apiResponse.data.requestStatus // "Complete"
val firstNumber = apiResponse.data.recipients.firstOrNull()?.number // "8801800000000"
val firstStatus = apiResponse.data.recipients.firstOrNull()?.status // "Sent"
Log.d("API", "Msg: $message, Status: $status, Number: $firstNumber, RecvStatus: $firstStatus")
}
} catch (e: Exception) {
Log.e("API", "Parse failed", e)
}</apiresponse>
✅ Java 版本关键点(如必须使用 Java)
- 使用 @SerializedName 显式绑定字段;
- List
需配合 TypeToken(若 Gson 手动解析); - Retrofit 建议搭配 Call
+ enqueue() 或 CompletableFuture;
? 重要注意事项
- 空安全优先:recipients 可能为空数组,务必使用 firstOrNull()、getOrNull(0) 或判空逻辑,避免 IndexOutOfBoundsException;
- 网络异常与 HTTP 错误:response.isSuccessful 仅表示 HTTP 状态码为 2xx,业务错误(如 error != 0)需额外判断;
-
Gson 初始化:确保 Retrofit Builder 中正确注册 GsonConverterFactory:
Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create(GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()))
通过结构化建模 + 类型安全解析,你不仅能精准提取 msg、request_status、number 和 status,还能获得编译期检查、IDE 自动补全和可维护性——这才是现代 Android 网络层的最佳实践。











