Gson – 用两个不同的键读取一个值

在我的Android项目中,我有两种types的响应,其中两个响应都是相同的,除了两个键

回应1

{"fullName":"William Sherlock Scott Holmes","address":"221B Baker Street, London, England, UK","downloads":642,"rating":3,"repos":["https://link1","https://link2","https://link3"]} 

回应2

 {"name":"Sherlock","city":"London","downloads":642,"rating":3,"repos":["https://link1","https://link2","https://link3"]} 

如果您看到答复,只有两个关键名称正在更改fullName /名称地址/城市

我不想为其他反应创造一个pojo。 现在我的问题是,是否有可能只使用一个Pojo来阅读这两个答复。

 public class AccountInfo { private String name; private String city; //other objects public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } //other setters and getters } 

任何帮助将不胜感激…

Solutions Collecting From Web of "Gson – 用两个不同的键读取一个值"

您可以使用@SerializedName批注注释成员接受来自两个不同json名称的值 :

 @SerializedName(value = "name", alternate = {"fullName"}) private String name; @SerializedName(value = "city", alternate = {"address"}) private String city; 

任何一个已命名的元素都可以放入这样注释的成员中。

更新:版本2.4中添加反序列化时, @SerializedName备用名称

是的,你可以完全使用一个POJO类来反序列化这两个响应。 你的POJO类将包含来自两个响应的密钥。

 public class Response { private String name; private String city; private String fullName; private String address; private Integer downloads; private Integer rating; private List<String> repos ; } 

但是在使用Response类的时候要注意,对于第一个响应名字城市将是空的第二个地址全名

是的,你可以在一个POJO中做到这一点。 尝试这个:

 public class POJO { @SerializedName("name") public String name; @SerializedName("city") public String city; @SerializedName("fullName") public String fullName; @SerializedName("address") public String address; @SerializedName("downloads") public Integer downloads; @SerializedName("rating") public Integer rating; @SerializedName("repos") public List<String> repos = new ArrayList<String>(); } 

parsing时,你必须检查值为null 。 对于例如 –

parsing响应1: 名称城市variables将为空

parsing响应2: 全名地址将为空

注意:在使用之前尝试检查null的值,否则将得到nullpointerexception

在你的POJO类中定义所有可能的字段

  public class AccountInfo { private String name; private String city; private String fullname; private String address; } 

在这些领域中执行操作检查null