Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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和GS2反序列化多形状JSON响应?_Java_Android_Json_Gson_Retrofit2 - Fatal编程技术网

Java 如何使用GSON和GS2反序列化多形状JSON响应?

Java 如何使用GSON和GS2反序列化多形状JSON响应?,java,android,json,gson,retrofit2,Java,Android,Json,Gson,Retrofit2,我有一个restApi,它的响应可以是这样的(如果只有一个对象要返回): 或者,如果还有更多,请这样做: { "keys": [ { "id":0, "name":"john", "pItems":12 }, { "id":0, "name":"john", "pItems":12

我有一个restApi,它的响应可以是这样的(如果只有一个对象要返回):

或者,如果还有更多,请这样做:

{
    "keys":
    [
        {
            "id":0,
            "name":"john",
            "pItems":12
        },
        {
            "id":0,
            "name":"john",
            "pItems":12
        }
    ]
}
当我为模型对象使用列表时,第一种情况不起作用。
如何使用Gson和Reformation2对其进行反序列化?

好的,您不能更改响应的设计,但您确定只能接收这些响应吗?如果是这样的话,也许你可以创造这样的东西:

class Response{
    public Object keys
}

class UserResponse{
    public int id;
    public String name;
    public int pItems; 
}
因此,您将有两个案例:

  • 您可以接收UserResponse对象
  • 您可以接收UserResponse对象的列表
  • 然后,要验证是否为UserResponse列表,可以如下所示:

    if (keys instanceof List<?>){
        // then keys is a list 
    }else{
        // then keys is a single object UserResponse
    }
    
    if(键列表实例){
    //然后是一个列表
    }否则{
    //然后keys是一个单一的对象UserResponse
    }
    
    您可以检查
    元素是否为数组,然后进行相应的反序列化

    假设您的模型类是UserWrapper.java

    import java.util.List;
    公共类用户包装器{
    私有列表密钥;
    公共列表getKeys(){
    返回键;
    }
    公共无效设置键(列表键){
    this.keys=keys;
    }
    }
    
    java是对应于
    keys
    属性的每个元素的类

    公共类用户{
    私有int-id;
    私有字符串名称;
    私有内部陷阱;
    公共int getId(){
    返回id;
    }
    公共无效集合id(内部id){
    this.id=id;
    }
    公共字符串getName(){
    返回名称;
    }
    公共void集合名(字符串名){
    this.name=名称;
    }
    公共int getPitems(){
    返回坑;
    }
    公共无效集合点(内部集合点){
    this.pitems=pitems;
    }
    }
    
    根据键的类型反序列化的代码

    import java.util.ArrayList;
    导入java.util.List;
    导入com.google.gson.gson;
    导入com.google.gson.GsonBuilder;
    导入com.google.gson.JsonElement;
    导入com.google.gson.reflect.TypeToken;
    公共类GsonMain{
    私有静态字符串json=“您的json”;
    公共静态void main(字符串[]args){
    Gson Gson=new GsonBuilder().create();
    JsonElement=gson.fromJson(json,JsonElement.class);
    JsonElement keyselement=JsonElement.getAsJsonObject().get(“keys”);
    UserWrapper UserWrapper=新的UserWrapper();
    if(keyselement.isJsonObject()){
    setKeys(新的ArrayList());
    User=gson.fromJson(keyselement,User.class);
    userWrapper.getKeys().add(用户);
    }else if(keyselement.isJsonArray()){
    List users=gson.fromJson(keyselement,new-TypeToken()){
    }.getType());
    userWrapper.setKeys(用户);
    }
    userWrapper.getKeys().forEach(user->System.out.println(user.getName());
    }
    }
    
    如果具有相同名称的属性可以是列表或单个对象,则这不是一个好的设计。您可以编写一个自定义反序列化程序,将大小写的单个对象转换为列表。@微笑我知道这是一个非常糟糕的设计,但restApi不是我的!我只是想用它
    if (keys instanceof List<?>){
        // then keys is a list 
    }else{
        // then keys is a single object UserResponse
    }