Android端Retrofit请求200状态但响应字段全为null的问题排查
问题根因与修正方案
问题定位
你遇到的状态码200但解析字段全为null的问题,核心来自三处实现偏差:
- 响应结构匹配错误(最核心原因)
实际接口返回的JSON根结构是包含result数组的对象,数组元素才是单条记录实体。你当前将Retrofit接口的响应泛型直接声明为Call<Record.Item>,相当于让Gson把整个根JSON强行映射到单条Item对象上,根本定位不到id/title等字段的位置,最终所有字段解析结果为null。 - 数据类定义不完整、类型不匹配
你定义的单条记录类遗漏了接口返回中的description字段;同时返回里的id、account_id为数字类型,你全部声明为String类型,即便结构匹配正确,类型不匹配也可能触发解析失败。 - Retrofit接口写法不规范
你在@GET注解中直接硬编码带?的查询参数,本次虽然碰巧拼接出了正确的请求地址,但不符合Retrofit的参数传递规范,后续极易出现地址拼接错误。
代码修正示例
1. 调整数据类定义,完全匹配返回结构
// 根响应对象,对应接口外层的result结构 data class RecordListResponse( val result: List<RecordItem> ) // 单条记录实体,字段名、类型与返回值严格对应 data class RecordItem( val id: Int, val account_id: Int, val title: String, val datetime: String, val description: String?, // 声明为可空,匹配返回中可能为null的场景 val image: String?, val recording: String? )
2. 修正Retrofit接口定义
interface Gett { // 用@Query注解传递查询参数,替代硬编码的查询串 @GET("records/") fun getRecord(@Query("account_id") accountId: Int): Call<RecordListResponse> }
3. 调整Retrofit初始化与请求逻辑
val retrofit = Retrofit.Builder() // baseUrl需以/结尾,仅指向域名+端口的根路径,不要拼接后续接口路径 .baseUrl("http://192.168.0.220:8000/") .addConverterFactory(GsonConverterFactory.create()) .build() val service = retrofit.create(Gett::class.java) // 传入account_id=2作为查询参数 val call = service.getRecord(accountId = 2) call.enqueue(object : retrofit2.Callback<RecordListResponse> { override fun onResponse(call: Call<RecordListResponse>, response: Response<RecordListResponse>) { if (response.isSuccessful) { // 正常获取到解析完成的记录列表 val recordList = response.body()?.result println("解析得到的记录列表:$recordList") } } override fun onFailure(call: Call<RecordListResponse>, t: Throwable) { println("请求失败:${t.message}") } })
补充排查提示
如果修正后仍存在解析问题,可添加HttpLoggingInterceptor打印接口原始返回的JSON串,逐字段和数据类的名称、类型做核对,避免出现字段名拼写不一致的问题。
内容的提问来源于stack exchange,提问作者123
相关产品推荐
相关产品推荐

