Gson - 读取具有两个不同键的值

在我的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"]}

如果您看到响应,只有两个键名正在更改全名/名称地址/城市

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

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


答案 1

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

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

然后,可以将任一命名元素放入按如下方式进行批注的成员中。

已更新:V2.4 中添加反序列化时的备用名称@SerializedName


答案 2

是的,您完全可以使用一个 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 类时,请注意,对于第一个响应名称城市将为 null,对于第二个响应,则为地址全名


推荐