【问题标题】:Gson - Read a value with two different keysGson - 用两个不同的键读取一个值
【发布时间】:2016-06-14 20:42:24
【问题描述】:

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

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

【问题讨论】:

  • 让那些额外的字段 getter 和 setter,如果 getter 字段为空不会产生任何问题。试试这个,让我知道是否可以为您提供任何其他帮助
  • @Rakshit 谢谢。检查道格史蒂文森的答案..

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


【解决方案1】:

是的,你可以在一个 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 变量将为 null

解析响应 2 时:fullnameaddress 将为 null

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

【讨论】:

  • 非常感谢...@Doug Stevenson 的回答更充分,因为我不必检查null
  • 这样做的方法不好
【解决方案2】:

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

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

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

更新: @SerializedNameVersion 2.4

中添加反序列化时的备用名称

【讨论】:

  • 获取 java.lang.IllegalArgumentException:无法为类创建转换器
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    在这些字段中执行 null 的操作检查时

    【讨论】:

    • 好吧。感谢您的回答...但是您没有检查其他答案是否与您回答的相同...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多