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/nameaddress/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 时:namecity 变量将为空

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

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

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

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

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

更新: @SerializedNameVersion 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