1

我正在使用Jackson从 jsoninputStream中解析 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
         }

}

由于这个提要非常大,我需要以更少的开销和内存有效地执行此操作。还有三种模型来处理 JSON:Streaming APIData BindingTree Model。哪一个适合我的目的?

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

编辑:(解决方案)

Jackson并且GSon两者几乎都以相同的机制工作(增量模式,因为内容是增量读取和写入的),我正在切换到GSON它具有功能skipValue()(非常适合名称)。尽管杰克逊的nextToken()工作方式对我skipValue()来说GSON似乎更灵活。感谢@Kowser bro 的推荐,我之前了解过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();
4

1 回答 1

3

这是为了Jackson

按照本教程

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

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

伪代码是

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

这是为了gson. 看看这个教程。考虑遵循教程中的第二个示例。

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

这是JsonReader的文档

于 2013-08-04T07:53:14.563 回答