Использование 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
Вот в чем проблема ... такая простая ошибка!
Эдуардо

Ответы:

112

Проблема вызвана запятой в конце (в вашем случае каждого ) объекта JSON, помещенного в массив:

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

Если вы удалите их, ваши данные станут

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

и

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

должно работать нормально.

Pshemo
источник
1
@Snake Кстати, в случае jacksonбиблиотеки и этого комментария создание массива и его упаковка Arrays.asList(..)выполняется быстрее, чем создание списка с использованием TypeRefence. Я не тестировал его с помощью gsonбиблиотеки, но, возможно, стоит протестировать его.
Pshemo 01
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);
Chenyueling
источник
4
Для меня это превращает мои объекты в список LinkedTreeMap вместо списка объектов спецификации (например).
Райан Ньюсом
Откуда у вас класс GsonUtils?
rosu alin
GsonUtilsэто класс, в который он поместил свой собственный toList()метод.
user1438038
Это не может работать: TypeToken должен создать неправильное значение, поскольку T не известен, когда он компилируется. Вероятно, это создаст токен типа для List <Object>. При создании типа вам придется использовать фактический класс.
Ханс-Петер Штёрр,
1
Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);
Шахзеб Хан
источник