使用GSON解析JSON数组


110

我有一个像这样的JSON文件:

[
    {
        "number": "3",
        "title": "hello_world",
    }, {
        "number": "2",
        "title": "hello_world",
    }
]

在文件具有根元素之前,我将使用:

Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);

代码,但我不认为如何对Wrapper类进行编码,因为根元素是数组。

我尝试使用:

Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);

与:

public class Wrapper{

    String number;
    String title;

}

但是还没有运气。使用这种方法我还能怎么读呢?

PS我有这个工作使用:

JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");

但是我更想知道如何使用这两种方法(如果可能)。


4
您确定标题元素后面有逗号吗?如果删除它们,Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);对我来说效果很好。
Pshemo

1
那就是问题..这么简单的错误!
Eduardo

Answers:


112

问题是由放置在数组中的JSON对象(在每种情况下)的末尾逗号引起的:

{
    "number": "...",
    "title": ".." ,  //<- see that comma?
}

如果删除它们,您的数据将成为

[
    {
        "number": "3",
        "title": "hello_world"
    }, {
        "number": "2",
        "title": "hello_world"
    }
]

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);

应该工作正常。


1
@Snake看看Google
Pshemo '18

1
@Snake BTW,在使用jackson库和此注释的情况下,创建数组并将其包装起来Arrays.asList(..)比使用TypeRefence创建列表要快。我没有使用gson库对其进行测试,但是可能值得对其进行基准测试。
Pshemo '18 -10-1

39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

似乎工作正常。但是,您的字符串中还有一个逗号。

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]

16
public static <T> List<T> toList(String json, Class<T> clazz) {
    if (null == json) {
        return null;
    }
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>(){}.getType());
}

样品电话:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);

4
对我来说,这将我的对象变成了LinkedTreeMap的列表,而不是规范对象的列表(例如)。
瑞安·纽瑟姆

您从哪里获得GsonUtils类的?
rosu alin

GsonUtils是他讲自己toList()方法的课。
user1438038

这是行不通的:TypeToken必须创建一个错误的值,因为在编译时不知道T。这可能会为List <Object>创建类型标记。创建类型时,您必须使用实际的类。
汉斯·彼得·斯托尔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.