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

时间:2013-08-04 06:37:16

标签: json jackson gson json-deserialization

我正在使用 Jackson 来解析json inputStream中的JSON,如下所示:

[
      [ 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

我想解析它并且只保留每个数组的前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
         }

}

由于此Feed很大,我需要以更少的开销和内存来有效地执行此操作。 还有三种模式可以使用JSON: Streaming API 数据绑定树模型。哪一个适合我的目的?

如何与杰克逊有效地解析这个json?如何跳过这18个元素并跳转到下一个数组以获得更好的性能?

编辑:(解决方案)

JacksonGSon几乎都在同一机制中工作(增量模式,因为内容是逐步读取和写入的),我正在切换到GSON,因为它有一个函数{ {1}}(非常适合名字)。虽然杰克逊的skipValue()将像nextToken()一样工作,但skipValue()对我来说似乎更灵活。感谢@Kowser兄弟的推荐,之前我开始了解GSON,但不知何故忽略了它。这是我的工作代码:

GSON

1 个答案:

答案 0 :(得分:3)

这适用于Jackson

关注this tutorial

明智地使用jasonParser.nextToken()可以帮助你。

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

伪代码是

  1. 找到下一个数组
    1. 读取值
    2. 跳过其他值
    3. 跳过下一个结束标记

  2. 这是gson。 看看this tutorial。请考虑以下教程中的第二个示例。

    明智地使用reader.begin* reader.end*reader.skipValue应该为您完成工作。

    以下是JsonReader

    的文档