Как разобрать объект JSON в пользовательский объект с помощью Gson?

У меня есть следующий объект JSON в виде строки:

[{"Add1":"101","Description":null,"ID":1,"Name":"Bundesverfassung","Short":"BV"},{"Add1":"220","Description":null,"ID":2,"Name":"Obligationenrecht","Short":"OR"},{"Add1":"210","Description":null,"ID":3,"Name":"Schweizerisches Zivilgesetzbuch","Short":"ZGB"},{"Add1":"311_0","Description":null,"ID":4,"Name":"Schweizerisches Strafgesetzbuch","Short":null}]

Теперь я создал класс, который представляет один из результатов:

public class Book {

    private int number;
    private String description;
    private int id;
    private String name;
    private String abbrevation;

    public Book(int number, String description, int id, String name, String abbrevation) {
        this.number = number;
        this.description = description;
        this.id = id;
        this.name = name;
        this.abbrevation = abbrevation;
    }

}

Теперь я хочу использовать Gson для анализа объекта JSON в список объектов Book. Я пробовал это так, но, очевидно, это не работает. Как я могу это исправить?

public static Book[] fromJSONtoBook(String response) {
        Gson gson = new Gson();
        return gson.fromJson(response, Book[].class);
    }

person Community    schedule 10.05.2011    source источник
comment
Все мои переменные в классе книги равны нулю.   -  person    schedule 10.05.2011


Ответы (2)


Ответ довольно прост, вы должны использовать аннотацию SerializedName, чтобы указать, какая часть объекта JSON используется для синтаксического анализа объекта JSON в объект Book:

public class Book {

    @SerializedName("Add1")
    private String number;

    @SerializedName("Description")
    private String description;

    @SerializedName("ID")
    private int id;

    @SerializedName("Name")
    private String name;

    @SerializedName("Short")
    private String abbrevation;

    public Book(String number, String description, int id, String name, String abbrevation) {
        this.number = number;
        this.description = description;
        this.id = id;
        this.name = name;
        this.abbrevation = abbrevation;
    }

}
person RoflcoptrException    schedule 10.05.2011
comment
Это мой предпочтительный подход при использовании Джексона. Я полагал, что это было у Гсона, но я не знал, что это было у меня в голове. +1 за еще одну отличную реализацию. - person nicholas.hauschild; 10.05.2011
comment
@RoflcoptrException, как мне сделать SerializedName внутренним объектом JSON. Я пытался @SerializedName("activity.id") сослаться на ключ «id» внутри объекта «активность», который находится внутри другого объекта JSON, но он возвращал значение null. Однако с братьями и сестрами объекта «активность» во внешнем объекте JSON все в порядке. - person Amruta-Pani; 22.05.2017

Я не уверен, что GSON знает, как сопоставить ваш JSONArray JSONObjects с вашим классом Book. У меня есть пара замечаний по поводу этой установки.

  • Если вы заметили, объекты JSONObject, составляющие массив JSONArray, содержат свойства «Add1» и «Short», но в вашем классе Book нет свойств с такими же именами.

  • Следует отметить типы. Я предполагаю, что «Add1» будет отображаться на числовое свойство (чисто предположение), а тип — String в JSONObject, но это int в классе Book.

  • Мне интересно, должен ли случай свойств класса Book соответствовать случаю JSONObject.

  • Ваш класс Book не содержит общедоступного конструктора по умолчанию, который, я думаю, должен сопоставить GSON.

Вышеизложенное — это всего лишь пара предложений, которые у меня есть, которые не обязательно являются правильными или полными, поскольку я раньше не использовал GSON.

person nicholas.hauschild    schedule 10.05.2011