Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
GSON解析JSON中的问题_Json_Performance_Gson - Fatal编程技术网

GSON解析JSON中的问题

GSON解析JSON中的问题,json,performance,gson,Json,Performance,Gson,我在GSON的JSON解析中遇到了问题 我的回答是 {"services":[{"service":{"name":"asd","id":"1"}}, {"service":{"name":"asdf","id":"2"}}, {"service":{"name":"asdfg","id":"3"}}]} 如何解析这个响应 意味着我在创建上述响应类时遇到问题 我创建了服务类,但我对如何创建服务类感到困惑 public class services { @Seriali

我在GSON的JSON解析中遇到了问题

我的回答是

    {"services":[{"service":{"name":"asd","id":"1"}},
    {"service":{"name":"asdf","id":"2"}},
    {"service":{"name":"asdfg","id":"3"}}]}
如何解析这个响应

意味着我在创建上述响应类时遇到问题 我创建了服务类,但我对如何创建服务类感到困惑

public class services {

@SerializedName("service")
ArrayList<service> list;

public services(){
    System.out.println("services constructor stuff");
    list= new ArrayList<service>();
}

/**
 * @return the list
 */
public ArrayList<service> getList() {
    return list;
}

/**
 * @param list the list to set
 */
public void setList(ArrayList<service> list) {
    this.list = list;
}
注意:我无法更改响应,因此不建议更改

谢谢您

Services.java

public class Services {

    private List<Service> services;

    public List<Service> getServiceList() {
        return services;
    }

    public void setServiceList(List<Service> services) {
        this.services = services;
    }
}
您的json解析逻辑如下:

Gson gson = new Gson();
String s = "{\"services\":[{\"service\":{\"name\":\"asd\",\"id\":\"1\"}},{\"service\":{\"name\":\"asdf\",\"id\":\"2\"}},{\"service\":{\"name\":\"asdfg\",\"id\":\"3\"}}]}";
Services services = gson.fromJson(s, Services.class);

基本上,json字符串不是简单的json数组格式,它实际上是json对象中的json数组。因此,这意味着您需要两个类,一个表示json数组中的每个项-Service.java,另一个充当包含项列表的包装器。

好的,我们需要创建一个中间层类来实现它。 Services.java

public class Services {
    private ArrayList<ServiceWrapper> services = new ArrayList<ServiceWrapper>();
    public ArrayList<ServiceWrapper> getServices() {
        return services;
    }
    public void setServices(ArrayList<ServiceWrapper> services) {
        this.services = services;
    }
}
public class ServiceWrapper {
    private Service service;
    public Service getService() {
        return service;
    }
    public void setService(Service service) {
        this.service = service;
    }
}
public class Service {
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
Service.java

public class Services {
    private ArrayList<ServiceWrapper> services = new ArrayList<ServiceWrapper>();
    public ArrayList<ServiceWrapper> getServices() {
        return services;
    }
    public void setServices(ArrayList<ServiceWrapper> services) {
        this.services = services;
    }
}
public class ServiceWrapper {
    private Service service;
    public Service getService() {
        return service;
    }
    public void setService(Service service) {
        this.service = service;
    }
}
public class Service {
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
下面是测试代码

Gson gson = new Gson();
String s = "{\"services\":[{\"service\":{\"name\":\"asd\",\"id\":\"1\"}},{\"service\":{\"name\":\"asdf\",\"id\":\"2\"}},{\"service\":{\"name\":\"asdfg\",\"id\":\"3\"}}]}";
Services services = gson.fromJson(s, Services.class);
for(ServiceWrapper serviceWrapper : services.getServices()){
    System.out.println(serviceWrapper.getService().getId());
    System.out.println(serviceWrapper.getService().getName());
}

@T.J.Crowder我已经编辑了问题thank you@test:引用您迄今为止尝试过的代码,这将帮助人们帮助您。@spiritwlker您检查过getServiceList()的大小了吗?它为我打印了3。您使用的是哪个版本的GSON?您是对的,谢谢,还有一个问题是我们可以使用ArrayList代替Listplz吗?您可以尝试获取值,因为它在all@test,是的,您是对的,它无法检索服务中的值。我已经在另一个答案框中发布了新的解决方案。它经过全面测试,并按预期打印值。