Android Retrofit调用API返回Null值问题求助
问题分析与解决方案
核心问题定位
你遇到的response.body()为null或字段值为空的问题,主要来自两个关键原因:
1. 实体类字段与JSON映射不匹配
DummyJSON的/todo/{id}接口返回的JSON字段为todo,但你的Todo类中,该字段的getter方法命名为getTitle()——Gson默认会根据getter方法推断字段名为title,无法匹配JSON中的todo字段,导致该字段值为空,甚至可能影响整个实体类的解析。
修复方案(二选一)
方案A:修正getter方法命名,与字段名一致
public class Todo { private int userId; private int id; private String todo; private boolean completed; public int getUserId() { return userId; } public int getId() { return id; } // 将getTitle()改为getTodo(),与字段名对应 public String getTodo() { return todo; } public boolean isCompleted() { return completed; } }
方案B:添加@SerializedName注解指定JSON字段名
如果需要保留getTitle()方法,可通过注解明确映射关系:
import com.google.gson.annotations.SerializedName; public class Todo { private int userId; private int id; // 指定JSON中的字段名为"todo" @SerializedName("todo") private String todo; private boolean completed; public int getUserId() { return userId; } public int getId() { return id; } public String getTitle() { return todo; } public boolean isCompleted() { return completed; } }
2. 未检查响应状态,缺少排查日志
直接调用response.body()前,未判断请求是否成功。如果响应状态码不在200-300范围内,response.body()会直接返回null,且你没有打印关键排查信息。
修复后的onResponse方法
@Override public void onResponse(Call<Todo> call, Response<Todo> response) { Log.e("info", "响应状态码: " + response.code()); if (response.isSuccessful()) { Todo todo = response.body(); if (todo != null) { Log.e("info", "userId: " + todo.getUserId()); Log.e("info", "id: " + todo.getId()); Log.e("info", "todo内容: " + todo.getTodo()); // 或todo.getTitle(),根据你的修复方案 Log.e("info", "是否完成: " + todo.isCompleted()); } } else { // 打印错误响应体,排查请求失败原因 try { Log.e("info", "错误响应内容: " + response.errorBody().string()); } catch (IOException e) { e.printStackTrace(); } } }
额外检查项
依赖与权限确认
确保Module的build.gradle中添加了Retrofit和Gson转换器依赖:implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'同时在
AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" />API路径验证
你的ApiInterface和ApiClient拼接后的URL为https://dummyjson.com/todo/1,完全符合DummyJSON的接口规范,无需修改。
内容的提问来源于stack exchange,提问作者zuni
相关产品推荐
相关产品推荐

