我正在使用 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个元素并跳转到下一个数组以获得更好的性能?
编辑:(解决方案)
Jackson
和GSon
几乎都在同一机制中工作(增量模式,因为内容是逐步读取和写入的),我正在切换到GSON
,因为它有一个函数{ {1}}(非常适合名字)。虽然杰克逊的skipValue()
将像nextToken()
一样工作,但skipValue()
对我来说似乎更灵活。感谢@Kowser兄弟的推荐,之前我开始了解GSON,但不知何故忽略了它。这是我的工作代码:
GSON
答案 0 :(得分:3)
这适用于Jackson
明智地使用jasonParser.nextToken()可以帮助你。
while (jasonParser.nextToken() != JsonToken.END_ARRAY) { // might be JsonToken.START_ARRAY?
伪代码是
这是gson
。
看看this tutorial。请考虑以下教程中的第二个示例。
明智地使用reader.begin*
reader.end*
和reader.skipValue
应该为您完成工作。
以下是JsonReader
的文档