Android Retrofit2请求返回对象字段为空?求排查原因
问题排查与解决
我帮你梳理了代码里的问题,最有可能的原因是这个:
1. 最核心问题:SerializedName注解导错包了!
Gson解析JSON依赖的是**com.google.gson.annotations.SerializedName**这个注解,但如果你不小心导入了其他包的同名注解(比如androidx.annotation.SerializedName),Gson完全不会识别这个注解,就会用字段名(比如login)去匹配JSON里的大写键(LOGIN),大小写不匹配自然就无法赋值,导致所有字段都是null。
解决方法:
检查User类的导入语句,确保注解来自Gson包:
import com.google.gson.annotations.SerializedName;
如果确认注解包没问题,再排查以下几个可能的点:
2. 字段访问权限问题
你的User类字段是默认的包访问权限(没有public修饰符),虽然Gson默认会通过反射突破访问权限,但如果User类和请求代码不在同一个包下,偶尔会出现反射访问失败的情况。可以试试:
- 把字段改为
public:public class User{ @SerializedName("LOGIN") public String login; // 其他字段同理 } - 或者自定义Gson实例,确保反射规则生效:
Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) .create(); Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create(gson)) .baseUrl("http://pastebin.com/raw/") .build();
3. 确认返回JSON的实际格式
虽然你给出的JSON示例是正确的,但建议先打印原始响应体,确认服务器返回的内容和你预期的一致:
@Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { // 打印原始响应内容 try { String rawResponse = response.errorBody() == null ? response.raw().body().string() : response.errorBody().string(); System.out.println("原始响应:" + rawResponse); } catch (IOException e) { e.printStackTrace(); } // 原有逻辑... }
这能排除服务器返回的JSON存在隐藏问题(比如键名拼写错误、嵌套结构不符等)。
4. 重写User类的toString()方法
你当前打印response.body()时,因为User没有重写toString(),只会输出对象地址,无法直观看到字段值。重写后能更方便排查:
@Override public String toString() { return "User{" + "login='" + login + '\'' + ", password='" + password + '\'' + ", name='" + name + '\'' + ", surname='" + surname + '\'' + '}'; }
内容的提问来源于stack exchange,提问作者Kirill Zorin
相关产品推荐
相关产品推荐

