You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:08:26