Как сделать из Json Model Pojo?

379
06 сентября 2017, 13:16

ссылка на json

Вся проблема в chapters. по сути это гавнокод такие вещи надо в массиве добавлять. Но что есть то есть. Как мне этот Json сделать в Pojo (Gson). Таким образом чтобы chapters был в массиве, а не как 5 отдельных объектов. Так как они всегда динамические.

А эту модель я хочу использовать для всех запросов такого типа.

Я знаю что надо как то chapters добавить в List<> или HashMap

Answer 1

Можно написать свой JsonDeserializer<Chapter[]>, который будет считывать json в Map<String, Chapter> (где Chapter это класс, представляющий главу), а затем этот Map преобразовывать в Chapter[] (используя методы Map::values и Collection::toArray).

Например, если json выглядит примерно так:

{
  "chapters": {
    "5767ab95-8ab0-490b-8c08-cd4963567f75": {
      "title": "Welcome"
    },
    "2eec0125-1613-4ed7-81b5-c10b55ba3e3d": {
      "title": "Understanding the Rules of the Game"
    },
    "21e66272-76bc-4586-a02f-c64bdaad9d4f": {
      "title": "Understanding Personality "
    }
  }
}

то можно написать такой код:

static class Chapter {
    String title;
    // остальные поля
}
static class Data {
    Chapter[] chapters;
    // остальные поля
}
static class ChapterArrayAdapter implements JsonDeserializer<Chapter[]> {
    @Override
    public Chapter[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        // получаем тип для Map<String, Chapter>
        Type mapType = new TypeToken<Map<String, Chapter>>() {}.getType();
        // десериализуем Map<String, Chapter>
        Map<String, Chapter> map = context.deserialize(json, mapType);
        // преобразуем в массив
        return map.values().toArray(new Chapter[0]);
    }
}
public static void main(String[] args) throws Exception {
    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(Chapter[].class, new ChapterArrayAdapter());
    Gson gson = builder.create();
    Data data = gson.fromJson(new FileReader("data.json"), Data.class);
}
READ ALSO
Java и вывод в консоль из message resource

Java и вывод в консоль из message resource

В задании указано, что информация в консоль должна выводиться из message resource (впервые столкнулся)Программа изменяет язык в соответствии с раскладкой...

259
java.lang.ClassNotFoundException: org.postgresql.Driver

java.lang.ClassNotFoundException: org.postgresql.Driver

Создал класс DatabaseHelper

350
Как на java работать с торрентами? [требует правки]

Как на java работать с торрентами? [требует правки]

Есть класс реализующий это? Или документация?

176
Проблемы с Travis CI. Java-проект

Проблемы с Travis CI. Java-проект

Впервые с ним работаюMaven-проект

331