Десериализация JSON строки, если строка не фиксированная, может быть с разным количеством ответов

195
15 апреля 2022, 14:00

Андроид приложение выполняет запрос в базу данных и получает ответ в JSON, ответ приходит в виде вложенных массивов(строки БД). И вот этих ответов может быть один, может пять. Как обработать эти разные варианты ?? С самого начала задача стояла, что ответов БД будет пять, я спокойно получал JSON на пять объектов и в JSON и десериализовал это в пять классов, из которых затем получал нужные данные. Затем задача расширилась, подключили еще одну БД и вот она по запросу может выдать разное количество объектов, и если их менее пяти - приложение падает. Ошибка:

NullPointerException: Attempt to invoke virtual method on a null object reference.

Я понимаю почему это происходит - объекта-то нет. И вот вопрос - как десериализовать JSON непостоянной длины ? Пробовал аннотации связанные с Null, не помогло либо я не понял как надо.

вот JSON

{
  "0": {"Comp_name":"161012","Comp_text":"Отзывная компания. ","Comp_Url":null},
  "1": {"Comp_name":"161012","Comp_text":"Сервисная компания.  ","Comp_Url":null},
  "2": {"Comp_name":"free","Comp_text":"Сервисные компании для Quoris","Comp_Url":null},
  "3": {"Comp_name":"free","Comp_text":"Сервисные компании для Quoris","Comp_Url":null}
}

так обработали JSON

    GsonBuilder builder = new GsonBuilder();
    Gson gson = builder.create();
    ExampleDB example1 = gson.fromJson(answerHTTP, ExampleDB.class);

Модель для парсинга

    public class ExampleDB {
    @SerializedName("0")
    @Expose
    private com.example.summa_post._0 _0;
    @SerializedName("1")
    @Expose
    private com.example.summa_post._1 _1;
    @SerializedName("2")
    @Expose
    private com.example.summa_post._2 _2;
    @SerializedName("3")
    @Expose
    private com.example.summa_post._3 _3;
    @SerializedName("4")
    @Expose
    private com.example.summa_post._4 _4;
    public com.example.summa_post._0 get0() {
        return _0;
    }
    public void set0(com.example.summa_post._0 _0) {
        this._0 = _0;
    }
    public com.example.summa_post._1 get1() {
        return _1;
    }
    public void set1(com.example.summa_post._1 _1) {
        this._1 = _1;
    }
    public com.example.summa_post._2 get2() {
        return _2;
    }
    public void set2(com.example.summa_post._2 _2) {
        this._2 = _2;
    }
    public com.example.summa_post._3 get3() {
        return _3;
    }
    public void set3(com.example.summa_post._3 _3) {
        this._3 = _3;
    }
    public com.example.summa_post._4 get4() {
        return _4;
    }
    public void set4(com.example.summa_post._4 _4) {
        this._4 = _4;
    }
Answer 1

Ответ нашелся. Можно не обращать внимание на то, что будет записано в классы после десериализации. При вызове метода из этого класса достаточно сделать исключение на Null.

READ ALSO
Как вытащить сущность, которая FetchType.LAZY?

Как вытащить сущность, которая FetchType.LAZY?

Имею сущность User и сущность Thing

242
WebView не открывает url с meta refresh

WebView не открывает url с meta refresh

WebView не может выгрузить ссылку с meta refreshОткрывает окно "Не удалось найти страницу"

226
Как обеспечить изоляцию в Unit тестах

Как обеспечить изоляцию в Unit тестах

Пытаюсь написать Unit тест "по всем правилам"

157
Как в spring обработать body в виде json?

Как в spring обработать body в виде json?

Пытаюсь изучить api в springGET Запрос хорошо посылается, а вот POST пока сложно

201