高效解析大型 JSON 数组的前四个元素

2023-12-25

我在用Jackson从 json 解析 JSONinputStream如下所示:

[
      [ 36,
        100,
        "The 3n + 1 problem",
         56717,
         0,
         1000000000,
         0,
         6316,
         0,
         0,
         88834,
         0,
         45930,
         0,
         46527,
         5209,
         200860,
         3597,
         149256,
         3000,
         1
      ],
      [
         ........
      ],
      [
         ........
      ],
         .....// and almost 5000 arrays like above
]

这是原始提要链接:http://uhunt.felix-halim.net/api/p http://uhunt.felix-halim.net/api/p

我想解析它并只保留每个数组的前 4 个元素并跳过其他 18 个元素。

36
100
The 3n + 1 problem
56717

到目前为止我尝试过的代码结构:

while (jsonParser.nextToken() != JsonToken.END_ARRAY) {

        jsonParser.nextToken(); // '['
        while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
            // I tried many approaches here but not found appropriate one
         }

}

由于此提要非常大,因此我需要以更少的开销和内存来高效地完成此操作。 另外还有三种处理 JSON 的模型:流媒体API, 数据绑定 and 树模型。哪一种适合我的目的?

我怎样才能用 Jackson 有效地解析这个 json ?如何跳过这 18 个元素并跳转到下一个数组以获得更好的性能?

编辑:(解决方案)

Jackson and GSon两者几乎以相同的机制工作(增量模式,因为内容是增量读取和写入的),我正在切换到GSON因为它有一个功能skipValue()(与名字相当合适)。虽然杰克逊的nextToken()会像skipValue(), GSON对我来说似乎更灵活。感谢@Kowser兄弟的推荐,我之前就知道GSON,但不知何故忽略了它。这是我的工作代码:

reader.beginArray();
while (reader.hasNext()) {
   reader.beginArray(); 
   int a = reader.nextInt(); 
   int b = reader.nextInt();
   String c = reader.nextString();
   int d = reader.nextInt();
   System.out.println(a + " " + b + " " + c + " " + d);
   while (reader.hasNext())
      reader.skipValue();
   reader.endArray();
} 
reader.endArray();
reader.close();

这是为了Jackson

Follow 本教程 http://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/.

明智地使用 jasonParser.nextToken() 应该会对您有所帮助。

while (jasonParser.nextToken() != JsonToken.END_ARRAY) { // might be JsonToken.START_ARRAY?

伪代码是

  1. find next array
    1. 读取值
    2. 跳过其他值
    3. 跳过下一个结束标记

这是为了gson。 看一眼本教程 http://www.mkyong.com/java/gson-streaming-to-read-and-write-json/。考虑遵循本教程中的第二个示例。

明智地使用reader.begin* reader.end* and reader.skipValue应该为你做这项工作。

这是文档杰森阅读器 http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/stream/JsonReader.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高效解析大型 JSON 数组的前四个元素 的相关文章

随机推荐

  • 调用默认 Phonegap 返回按钮处理程序

    我有一个phonegap应用程序 需要我捕获后退按钮 这工作顺利 但是当我在主屏幕上并按下后退按钮时 我想调用原始事件处理程序并让应用程序关闭或通过这样的按下自然地执行平台上的任何操作 我知道我可以告诉应用程序退出 但我知道这对于 iPho
  • 如何设置.data节的对齐方式?

    我在中定义了以下变量 dataNASM 部分 section data var1 DD 12345 int 4 bytes var2 DB A char 1 byte padding1 DB 123 1 byte padding paddi
  • CORS Java服务器端实现

    我需要实施CORS http www w3 org TR cors基于 Jersey 的 REST 服务器的支持 我已经浏览了一些可用的material http software dzhuvinov com cors filter htm
  • 如何声明一个哈希函数以在命名空间内的 unordered_set 中使用?

    我已经成功创建了一个哈希函数 并且 override 用于自定义类 这样我就可以在unordered set 但是 理想情况下 我想在要使用的类附近为我的类定义模板专业化 这可以通过以下方法来完成 效果很好 class MyClass pu
  • 我如何知道 SQL 全文索引填充何时完成?

    我们正在为针对测试 SQL Server 数据库运行的 ASP NET 应用程序编写单元测试 也就是说 ClassInitialize 方法创建一个包含测试数据的新数据库 ClassCleanup 删除该数据库 我们通过从代码运行 bat
  • 当角度材质选择打开时禁用滚动

    默认情况下 角度材质的 select dropwon 将允许页面滚动并相应地重新定位 在材料文档的原始页面上 选择下拉列表显示了不同的行为 它在打开时阻止滚动 https material angular io components sel
  • 如何使用 django 、 Location.objects.all() 获取第一个元素和最后一个元素

    这是我的代码 obj list Location objects all first element obj list 0 last element obj list 1 then return render to response tem
  • 如何使用 Python 在 Seaborn 中保存绘图 [重复]

    这个问题在这里已经有答案了 我有一个 Pandas 数据框并尝试将绘图保存在 png 文件中 然而 似乎有些事情并没有按预期进行 这是我的代码 import pandas import matplotlib pyplot as plt im
  • 我们可以调用 va_start() 两次而不调用 va_end() 吗?

    这是我的最小示例 include
  • Jenkins Pipeline 特定阶段的触发器

    我从一开始就在使用 Jenkins 但我想做点什么 但我找不到如何做 事实上 我想用两种不同的方式触发我的项目 每 4 小时和每次提交 但对于每种情况 我不希望执行所有 Jenkinsfile 只执行某些特定阶段 是否可以使用声明式管道来做
  • 使用 Git 和 Heroku 进行正确的持续集成和持续部署

    我正在使用 heroku 和 git 开发一个 ruby on Rails 网站 我应该使用哪些工具和功能来建立以下简单的开发流程 代码 gt 签入 gt 自动测试 gt 自动部署 我将代码签入我的存储库 首选选项 托管 git 如 git
  • 确定 sprintf 缓冲区大小 - 标准是什么?

    当像这样转换 int 时 char a 256 sprintf a d 132 确定多大的最佳方法是什么a应该 我认为手动设置它是可以的 因为我已经看到它到处使用 但它应该有多大 32 位系统上可能的最大 int 值是多少 是否有一些棘手的
  • 如何在 Chart.js 中循环工具提示附加数据

    这里我有一个图表 其中包含来自数据库表的 x 轴数据和 y 轴数据 现在我面临的问题是 无论我尝试将第三个数据附加到afterbody工具提示中的回调函数 它将在每个工具提示中显示完整数据 但我想分别将这些数据附加到每个工具提示中 like
  • 主动存储种子Rails

    我想为我的数据库添加一些包含活动存储附件的实例 但我不知道如何做到这一点 我尝试了一些方法但没有成功 这是我的种子 User create email email protected cdn cgi l email protection p
  • DMCS 中的 D 代表什么?

    所以 我正在阅读有关单声道 C 编译器 http www mono project com docs about mono languages csharp 我知道这些应用程序的用途是什么 但我只是想知道缩写代表什么 另外 gmcs smc
  • Android hprov-dump 给我错误:期待 1.0.3

    我在 eclipses DDMS 中使用了转储 HPROF 文件选项 并将我的 hprof 文件命名为 in hprof 但是当我尝试执行以下操作时hprov conf in hprof out hprof从命令行它给我错误 错误 期待 1
  • 使文本块只读

    目前我在滚动查看器控件中放置了一个文本块 如何使文本块只读 文本块 http msdn microsoft com en us library system windows controls textblock aspx已经是只读的 它们旨
  • 为什么会出现错误 ORA-00937

    对于每名获得三架以上飞机认证的飞行员 找到 援助和他 或她 所乘坐的飞机的最大航程 认证为 我有四张桌子 FLIGHTS flno varchar 出发地 varchar 目的地 varchar 距离 整数 出发 日期 到达 日期 飞机 a
  • Android httpclient cookie拒绝非法路径属性

    我正在构建一个 Android 应用程序 它使用 httpclient 将数据发布到 WordPress 服务器并检索数据 由于 cookie 中的路径无效 我无法发送发布数据 这是我检索到的日志 Cookie rejected Basic
  • 高效解析大型 JSON 数组的前四个元素

    我在用Jackson从 json 解析 JSONinputStream如下所示 36 100 The 3n 1 problem 56717 0 1000000000 0 6316 0 0 88834 0 45930 0 46527 5209