Retrofit请求响应成功但Result集合为空的技术排查求助
问题排查与解决方案
嘿,我一眼就瞅出问题出在哪了!咱们先拆解下核心矛盾:
你返回的JSON响应里,集合对应的key是result,但你的Respon实体类里用的是resultBab字段名——Gson默认是严格按照字段名和JSON key完全匹配来解析的,这就导致Gson找不到对应的值,自然把resultBab设为null了。
先看你的JSON结构(划重点):
{"value":1,"result":[{"id_bab":"4","id_kitab":"1","bab":"Wudhu"},...]}
解决方案有两种,选一种就行:
方案1:用@SerializedName注解映射字段
不用改字段名,给resultBab加上注解指定JSON里的key:
public class Respon { private String value; // 告诉Gson:这个字段对应JSON里的"result" key @SerializedName("result") private List<BabResult> resultBab; // getter方法保持不变 public String getValue() { return value; } public List<BabResult> getResultBab() { return resultBab; } }
方案2:直接修改字段名和JSON key一致
把实体类的字段名改成result,和JSON里的key对齐:
public class Respon { private String value; private List<BabResult> result; // getter也要对应改成getResult() public String getValue() { return value; } public List<BabResult> getResult() { return result; } }
⚠️ 注意:用这个方案的话,Activity里的代码也要同步修改:
// 把原来的getResultBab()改成getResult() results = response.body().getResult();
额外的优化建议(避免踩坑)
- 增加非空判断:在
onResponse里先确认响应体不为null,防止空指针崩溃:
@Override public void onResponse(Call<Respon> call, Response<Respon> response) { pbLoading.setVisibility(View.GONE); // 先判断请求成功且响应体非空 if (response.isSuccessful() && response.body() != null) { String value = response.body().getValue(); // 用"1".equals(value)更安全,避免value为null时崩溃 if ("1".equals(value)) { results = response.body().getResultBab(); babAdapter = new BabAdapter(MenuBab.this, results); rvBab.setAdapter(babAdapter); } } }
- 修复Adapter的getItemCount:原来返回4的逻辑会导致
results为null时触发索引越界,改成返回0更合理:
@Override public int getItemCount() { return results == null ? 0 : results.size(); }
内容的提问来源于stack exchange,提问作者RPH
相关产品推荐
相关产品推荐

