Використання 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);для мене добре працює.
Пшемо

1
У цьому і буде проблема .. така проста помилка!
Едуардо

Відповіді:


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 BTW, якщо jacksonбібліотека і цей коментар створює масив і Arrays.asList(..)завершує його , швидше, ніж створення списку за допомогою TypeRefence. Я не перевіряв його з gsonбібліотекою, але, можливо, варто його порівняти.
Пшемо

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 замість списку об'єктів специфікацій (наприклад).
Ryan Newsom

Де ви взяли клас GsonUtils?
rosu alin

GsonUtilsце клас, куди він вклав свій toList()метод.
користувач1438038

Це не може працювати: TypeToken повинен створити неправильне значення, оскільки T невідомо, коли це компілюється. Можливо, це створить маркер типу для списку <Object>. Вам потрібно буде використовувати фактичний клас при створенні типу.
Ганс-Пітер Штерр

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.