Gson - 使用两个不同的键读取值

时间:2016-03-02 06:07:11

标签: java android android-studio gson android-json

在我的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 地址/城市

我不想再为其他回复创建一个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
}

任何帮助将不胜感激......

4 个答案:

答案 0 :(得分:40)

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

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

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

更新: 在[strong> Version 2.4

中添加反序列化时的@SerializedName个替代名称

答案 1 :(得分:1)

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

constructor(private _injector:Injector) {
  var bar = _injector.get('bar');
  var bar2 = _injector.get('bar2');
}

但是在使用Response类时,请注意第一个响应名称城市 null 第二个地址全名

答案 2 :(得分:0)

是的,你可以在一个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:名称城市变量将为空

虽然解析响应2:全名地址将为空

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

答案 3 :(得分:0)

定义POJO类中的所有可能字段,如

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

在这些场地中执行操作检查时