Gson - 使用两个不同的键读取一个值
Gson - Read a value with two different keys
在我的 Android 项目中,我有两种类型的响应,其中 响应完全相同,除了两个键 。
回复 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/name 和 address/city
我不想再为其他响应创建一个 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
}
任何帮助将不胜感激...
是的,您可以在一个 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>();
}
解析时,您必须检查 null 的值。例如 -
解析响应 1 时:name 和 city 变量将为空
解析响应 2 时:全名 和 地址 将为空
注意:在使用之前尝试检查 null 值,否则您将得到 nullpointerexception
您可以使用 @SerializedName 注释对成员进行注释以接受来自两个不同 json 名称的值:
@SerializedName(value = "name", alternate = {"fullName"})
private String name;
@SerializedName(value = "city", alternate = {"address"})
private String city;
然后可以将任一命名元素放入这样注释的成员中。
更新:
@SerializedName
在 Version 2.4
中添加了反序列化时的备用名称
是的,您完全可以使用一个 POJO class 来反序列化两个响应。您的 POJO class 将包含来自两个响应的键。
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 ;
}
但是当使用响应class时,请注意第一次响应,名称和city 将是 null,对于 第二个 ,address 和全名.
在您的 POJO 中定义所有可能的字段 Class 喜欢
public class AccountInfo {
private String name;
private String city;
private String fullname;
private String address;
}
在这些字段中执行操作检查是否为 null
在我的 Android 项目中,我有两种类型的响应,其中 响应完全相同,除了两个键 。
回复 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/name 和 address/city
我不想再为其他响应创建一个 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
}
任何帮助将不胜感激...
是的,您可以在一个 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>();
}
解析时,您必须检查 null 的值。例如 -
解析响应 1 时:name 和 city 变量将为空
解析响应 2 时:全名 和 地址 将为空
注意:在使用之前尝试检查 null 值,否则您将得到 nullpointerexception
您可以使用 @SerializedName 注释对成员进行注释以接受来自两个不同 json 名称的值:
@SerializedName(value = "name", alternate = {"fullName"})
private String name;
@SerializedName(value = "city", alternate = {"address"})
private String city;
然后可以将任一命名元素放入这样注释的成员中。
更新:
@SerializedName
在 Version 2.4
是的,您完全可以使用一个 POJO class 来反序列化两个响应。您的 POJO class 将包含来自两个响应的键。
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 ;
}
但是当使用响应class时,请注意第一次响应,名称和city 将是 null,对于 第二个 ,address 和全名.
在您的 POJO 中定义所有可能的字段 Class 喜欢
public class AccountInfo {
private String name;
private String city;
private String fullname;
private String address;
}
在这些字段中执行操作检查是否为 null