首页 > 解决方案 > GSON 或 Jackson 是否支持从巨大的 JSON 文档中提取对象数组作为流的方法?

问题描述

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

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

谢谢

标签: jsongsonstreaming

解决方案


您部分处于正确的轨道上,但有一种更简单的方法可以做到这一点。

只需声明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);

推荐阅读