Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/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
Java Gson:反序列化元素类型不同的数组_Java_Json_Parsing_Gson - Fatal编程技术网

Java Gson:反序列化元素类型不同的数组

Java Gson:反序列化元素类型不同的数组,java,json,parsing,gson,Java,Json,Parsing,Gson,我尝试用Gson库反序列化json字符串; 我有以下课程 class Foo { int Id; String Name; } 以及下面的json字符串 {response: [123, { id: 1, name: 'qwerty'}, { id: 2, name: 'asdfgh'}, ]} 我尝试反序列化此字符串,以便 Gson gson = new Gson(); Foo[] res = gson.fromJson(jsonStr, Foo[].cl

我尝试用Gson库反序列化json字符串; 我有以下课程

class Foo {
    int Id;
    String Name;
}
以及下面的json字符串

{response: [123, { id: 1, name: 'qwerty'}, { id: 2, name: 'asdfgh'}, ]}
我尝试反序列化此字符串,以便

Gson gson = new Gson();         
Foo[] res = gson.fromJson(jsonStr, Foo[].class);
但我失败了,因为这个字符串不包含纯json数组,而是包含字段“response”的对象,该字段就是数组。 我的第二个问题是,除了Foo对象之外,response包含文字“123”

我想知道如何避免这些问题?我是否应该手动解析字符串,提取数组的内容,从中删除不必要的文本,并将解析结果提供给fromJson方法,或者
有什么方法可以让我做得更简单

没有与您尝试反序列化的json数组兼容的Java类型。您应该使用JsonParser获取JsonObject,然后手动处理该JsonObject

JsonParser p = new JsonParser();
JsonObject jsonObject = (JsonObject)p.parse(yourJsonString);
然后,您可以像这样处理jsonObject:

    List<Foo> foos = new ArrayList<Foo>();
    JsonArray response = jsonObject.getAsJsonArray("response");
    for (int i = 0; i < response.size(); i++) {
        JsonElement el = response.get(i);
        if (el.isJsonObject()) {
            Foo f = new Foo();
            JsonObject o = el.getAsJsonObject();
            int id = o.getAsJsonPrimitive("id").getAsInt();
            String name = o.getAsJsonPrimitive("name").getAsString();
            f.Id = id;
            f.Name = name;      
            foos.add(f);
        }
    }
    List<Foo> foos = new ArrayList<Foo>();
    JsonArray response = jsonObject.getAsJsonArray("response");
    for (int i = 0; i < response.size(); i++) {
        JsonElement el = response.get(i);
        if (el.isJsonObject()) {
            JsonObject o = el.getAsJsonObject();
            Foo f = gson.fromJson(o, Foo.class);
            foos.add(f);
        }
    }
class Foo {
    int id;
    String name;
}

没有所谓的“纯”JSON数组。RFC 7159明确指出,根本不要求JSON数组的所有成员都必须是同一类型的(更重要的是,您的JSON实际上不是合法的JSON)。好吧,将此数组转换为“纯”(或“合法”)的最简单、最快的方法是什么?读作
JsonElement
,并过滤掉不必要的元素,然后反序列化;这是我的建议。另一个解决方案是,如果要使用gson.fromJson(),则通常使用流式API,需要确保类成员名称与Json字符串中的属性名称匹配。你的不是因为资本化。