Поддерживает ли GSON или Джексон способ извлечения массива объектов в виде потока из огромного документа JSON? - PullRequest
0 голосов
/ 12 октября 2018

Мое требование - прочитать огромный документ JSON, как показано ниже.Однако я не заинтересован в определенных частях документа, а только в массиве объектов, которые я хотел бы десериализовать и сохранить как сущности.В настоящее время я использую библиотеку Gson, и я намерен не загружать весь массив в память, а анализировать их как поток один за другим.

Мой документ JSON выглядит следующим образом:

{
  "header":{
            ..........
            ..........
   },
   "data": [{},{},{}.......]
  "trailer":{
   }
}

при условии, что вышеприведенный JSON представляет объект с именем Document

public class Documemt{
    private Header header;
    private Data[] data;
    private Trailer trailer;
}

. Меня интересуют данные []

. Я начал делать следующее:

InputStream is = Sample.class.getResourceAsStream("/SampleJSON.json");
JsonReader reader = new JsonReader(new InputStreamReader(is));
reader.beginObject();
while(reader.hasNext()){

    //At this point, I'm having issues.
    gson.fromJson(reader,Document.class); //This will load the entire document into memory. which I do not want.
}
reader.endObject();           
* 1013.* Есть ли способ пропустить заголовок и трейлер и создать объект Data [] в виде потока.

что-то вроде

 if token == header || token==trailer then
      skip
 else
     Stream<Data> data = jsonReader.read

Любые указатели или примеры для такого требования.

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вы частично на правильном пути, но есть более простой способ сделать это.

Просто объявите класс DTO, который содержит только Data[], например:

public class DataOnlyDocument {
    private Data[] data;
}

Тогда ваш Reader может быть просто:

Reader r = new InputStreamReader(getClass()
                    .getClassLoader().getResourceAsStream("/SampleJSON.json"));

И Gson с радостью будет использовать этот читатель:

DataOnlyDocument dod = gson.fromJson(r, DataOnlyDocument.class);
0 голосов
/ 12 октября 2018

Я не уверен, что мой подход верен, но я добился результатов следующим образом

    Gson gson = new Gson();
    InputStream is = Sample.class.getResourceAsStream("/SampleJSON.json");
    JsonReader reader = new JsonReader(new InputStreamReader(is));
    reader.beginObject();
    while(reader.hasNext()){

        String tokenName = reader.nextName();
        if("header".equals(tokenName) || "trailer".equals(tokenName)){

            reader.skipValue();
            continue;
        }
        reader.beginArray();
        while(reader.hasNext()){
            Data data = gson.fromJson(reader, Data.class);
            System.out.println(data);
            count++;
        }
        reader.endArray();
    }
    reader.endObject();
    System.out.println("Count ->"+count);

Есть ли недостаток в моем решении?Есть ли лучшие альтернативы этому подходу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...