Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson-使用两个不同的键读取值_Java_Android_Android Studio_Gson_Android Json - Fatal编程技术网

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

Java Gson-使用两个不同的键读取值,java,android,android-studio,gson,android-json,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":"Sherloc

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

任何帮助都将不胜感激

是的,你可以在一次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>();

}
公共类POJO{
@序列化名称(“名称”)
公共字符串名称;
@序列化名称(“城市”)
公共字符串城市;
@SerializedName(“全名”)
公共字符串全名;
@序列化名称(“地址”)
公共字符串地址;
@SerializedName(“下载”)
公开整数下载;
@序列化名称(“评级”)
公众整数评级;
@序列化名称(“回购”)
public List repos=new ArrayList();
}
解析时,必须检查null的值。例如-

解析响应1时:namecity变量将为空

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


注意:在使用else之前,请尝试检查null值。您将获得nullpointerexception

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

@SerializedName(value = "name", alternate = {"fullName"})
private String name;
@SerializedName(value = "city", alternate = {"address"})
private String city;
然后,可以将任一命名元素放置到注释如下的成员中

更新:
@SerializedName
当在

中添加反序列化时,您可以完全使用一个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类时,请注意,对于第一个Response名称和城市将为空,对于第二个地址和全名将定义POJO类中所有可能的字段,如

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

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

将这些额外字段设置为getter和setter,如果getter字段为空,则不会产生任何问题。试试这个,如果我能帮你什么,请告诉我else@Rakshit谢谢检查道格·史蒂文森的回答……非常感谢@Doug Stevenson的答案更充分,因为我不必检查
null
。做得好的方法不好。谢谢你的回答。。。但您是否检查了其他答案是否与您的答案相同…getting java.lang.IllegalArgumentException:无法为类创建转换器