You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Retrofit获取响应返回Null问题求助

Retrofit响应返回Null问题排查与解决

看起来你遇到了Retrofit解析响应返回Null的问题,既然Postman能正常拿到数据,那问题基本出在客户端的JSON解析环节,大概率是数据模型类和JSON结构不匹配导致的。结合你给出的JSON数据,我帮你一步步分析解决:

1. 先明确JSON的结构

你调试得到的JSON格式化后更清晰:

{ 
  "regData": [ 
    { 
      "registrationType": "User", 
      "userDetails": { 
        "city": "Bangalore ", 
        "country": "Bangalore ", 
        "email": "hfhg@lll.com", 
        "name": "Cxhcc", 
        "password": "123456", 
        "phoneno": "486586" 
      }, 
      "vehicleRegsiration": {} 
    } 
  ] 
}

核心结构:

  • 根对象包含一个名为regData的数组
  • 数组内的每个元素包含三个字段:registrationType(字符串)、userDetails(嵌套对象)、vehicleRegsiration(空对象)

2. 最常见的错误点及修正方案

错误点1:模型类字段名与JSON键名不匹配

尤其要注意vehicleRegsiration的拼写(JSON里是这个,别写成vehicleRegistration),字段名必须和JSON键完全一致,或者用@SerializedName注解映射。

错误点2:根对象解析错误

很多人会直接把regData数组当成根对象解析,但实际上JSON的根是一个包含regData的对象,必须先定义根模型类。

正确的模型类示例

以下是对应这个JSON的完整Java模型类(基于Gson注解):

根响应类

public class RegistrationResponse {
    @SerializedName("regData")
    private List<RegDataItem> regData;

    // Getter & Setter
    public List<RegDataItem> getRegData() {
        return regData;
    }

    public void setRegData(List<RegDataItem> regData) {
        this.regData = regData;
    }
}

RegDataItem类(数组内的元素)

public class RegDataItem {
    @SerializedName("registrationType")
    private String registrationType;

    @SerializedName("userDetails")
    private UserDetails userDetails;

    @SerializedName("vehicleRegsiration") // 注意拼写和JSON完全一致!
    private VehicleRegistration vehicleRegsiration;

    // Getters & Setters
    public String getRegistrationType() {
        return registrationType;
    }

    public void setRegistrationType(String registrationType) {
        this.registrationType = registrationType;
    }

    public UserDetails getUserDetails() {
        return userDetails;
    }

    public void setUserDetails(UserDetails userDetails) {
        this.userDetails = userDetails;
    }

    public VehicleRegistration getVehicleRegsiration() {
        return vehicleRegsiration;
    }

    public void setVehicleRegsiration(VehicleRegistration vehicleRegsiration) {
        this.vehicleRegsiration = vehicleRegsiration;
    }
}

UserDetails类(嵌套对象)

public class UserDetails {
    @SerializedName("city")
    private String city;

    @SerializedName("country")
    private String country;

    @SerializedName("email")
    private String email;

    @SerializedName("name")
    private String name;

    @SerializedName("password")
    private String password;

    @SerializedName("phoneno")
    private String phoneno;

    // Getters & Setters
    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPhoneno() {
        return phoneno;
    }

    public void setPhoneno(String phoneno) {
        this.phoneno = phoneno;
    }
}

VehicleRegistration类(空对象)

因为JSON里这个字段是空对象,所以即使没有字段也要定义这个类,否则解析会失败:

public class VehicleRegistration {
    // 后续如果有字段可以添加,现在空类即可
}

3. 检查Retrofit接口定义

确保你的接口返回类型是Call<RegistrationResponse>,而不是直接Call<List<RegDataItem>>,示例:

public interface ApiService {
    @POST("your-registration-api-endpoint")
    Call<RegistrationResponse> postRegistration(@Body YourRegistrationRequestModel request);
}

4. 额外排查点

  • 确认Retrofit配置了Gson转换器:如果没添加GsonConverterFactory.create(),解析会失败返回Null
  • 开启Retrofit日志,打印完整的响应体,确认和你调试得到的JSON一致,避免中间有拦截器修改了响应
  • 检查请求Body是否和接口要求一致(虽然Postman正常,但代码里可能参数有误,不过你能拿到JSON的话这个概率低)

内容的提问来源于stack exchange,提问作者DJhon

火山引擎 最新活动