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




