使用 Gson 获得响应

Posted

技术标签:

【中文标题】使用 Gson 获得响应【英文标题】:Get Response With Gson 【发布时间】:2021-05-05 09:47:02 【问题描述】:

我正在尝试通过改造 + rxjava + gson 接收响应

我们的后端是用 laravel 开发的。

问题是 gson 无法将 json 转换为我的 java 类

这是我的课程和回答的示例

回复样本:


"data": 
    "id": 3,
    "name": "name",
    "last_name": "last name",
    "phone_number": "091212345678",
    "avatar": null

还有 java 类:

public class User 
private Long id;
private String name;
private String last_name;
private String phone_number;
private String role;
@SerializedName("avatar")
private String profilePicture;


public Long getId() 
    return id;


public void setId(Long id) 
    this.id = id;


public String getName() 
    return name;


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


public String getLastName() 
    return last_name;


public void setLastName(String last_name) 
    this.last_name = last_name;


public String getPhone_number() 
    return phone_number;


public void setPhone_number(String phone_number) 
    this.phone_number = phone_number;


public String getRole() 
    return role;


public void setRole(String role) 
    this.role = role;


public String getProfilePicture() 
    return profilePicture;


public void setProfilePicture(String profilePicture) 
    this.profilePicture = profilePicture;

我不知道 json 响应中的“数据”是什么。

以及为什么 gson 不能将 json 转换为 java。

请帮帮我

【问题讨论】:

【参考方案1】:

由于这个 json 响应是嵌套的,您应该通过在内部包装用户对象来设计如下所示的类以正确解析此响应。

public class User 

public Long id;
public String name;
public String last_name;
public String phone_number;
public String avatar;


-----------------------------------
public class Data 

public User user;


【讨论】:

【参考方案2】:

像这样重新设计你的模型类:

public class User 

@SerializedName("data")
public Data data;

// Generate getter setter for all the field here


现在使用您的 Json 属性创建另一个名为 Data 的类:

public class Data 

public Long id;
public String name;
public String last_name;
public String phone_number;
public String avatar;

// Generate getter setter for all the field here


现在您可以访问如下字段:

User user = new User();
//get name
user.getData().getName();
//set name
user.getData().setName("Demo");

【讨论】:

我看到您最近一直在编辑关于 SO 的问题,感谢您提供的所有帮助 :) 在进行编辑时,还请检查问题是否真的需要android studio标签,很多人无缘无故添加,比如这个问题也有标签,不需要它 这个答案对我有帮助,谢谢!但我不明白为什么 laravel 在响应中放置“数据”和额外的层是不必要的【参考方案3】:

您有一个名为“data”的 JSON 对象,而 User 类不包含用于存储“data”对象内容的数据字段。 Gson 正在 User 类中寻找一个名为“data”的字段,该字段可以保存“data”对象的内容,但没有找到。现在有两种方法可以解决这个问题。

    以这种格式返回您的 JSON 对象:

    “id”:3, “名称”:“名称”, "last_name": "姓氏", “电话号码”:“091212345678”, “头像”:空

2.1 创建一个Data类并在User类中声明:

public class Data   
private Long id;  
private String name;  
private String last_name;  
private String phone_number;  
private String role;  
@SerializedName("avatar")  
private String profilePicture;  
/*Getters and setters here*/ 

2.1。在 User 类中声明数据字段

public class User   private Data data; public Data getData()   return data; 

【讨论】:

以上是关于使用 Gson 获得响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在HashMap中存储一个带Gson的JSON

Struts2 怎么获得前台传来json中的 map。

如何使用 JCrop 获得响应式图像

使用 Alamofire 获得空响应

使用 AFNetworking 未获得完整的响应标头

如何获得服务器的响应时间?