GSON或Jackson是否支持从大型JSON文档中提取对象数组作为流的方法?

时间:2018-10-12 02:23:31

标签: json gson streaming

我的要求是阅读一个巨大的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();           

是否可以跳过Header和Trailer,并将Data []对象创建为流。

类似

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

任何此类要求的指针或示例。

谢谢

2 个答案:

答案 0 :(得分:0)

我不确定我的方法是否正确,但是我获得了如下结果

    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);

我的解决方案是否存在缺陷?是否有更好的替代方法?

答案 1 :(得分:0)

您目前处在正确的轨道上,但是有一种更简便的方法来实现此目的。

只需声明仅包含DTO的{​​{1}}类,例如:

Data[]

然后您的public class DataOnlyDocument { private Data[] data; } 可以是:

Reader

Reader r = new InputStreamReader(getClass() .getClassLoader().getResourceAsStream("/SampleJSON.json")); 将通过以下方式愉快地使用该阅读器:

Gson