json - 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
此类要求的任何指针或示例。
谢谢
解决方案
您部分处于正确的轨道上,但有一种更简单的方法可以做到这一点。
只需声明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);
推荐阅读
- c# - 使用 File.Copy 时访问被拒绝
- sql - PostgresSQL 无法按 json_build_object 结果排序(从子查询获得)
- c - 实现条目超时的 C 哈希表的最有效方法是什么?
- c++ - 用于 stm32cube IDE 的 TLC5940 软件库
- c# - Azure IotHubException 在尝试接收消息时出现“连接已关闭,因为另一个 AMQP 客户端打开了接收链接”
- sharepoint - Spfx 扩展自定义操作组件 ID 由查询参数指定,但找不到匹配的清单
- python - 当我在管理员中为 Season 添加条目时出现 AttributeError ,此错误来自 'Season' 对象没有属性 'tv_show_publish'
- python - 当我在 python 中绘制某些东西时,程序执行会停止,直到我关闭绘图图
- flutter - Flutter 是否可以在 build 方法中仅使用 if 条件?
- python - 如何使用 keras 模型和 TFrecords 数据制作混淆矩阵?