2013-08-04 163 views
2

我使用傑克遜從JSON inputStream,它看起來像下面的解析JSON:解析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:流媒體API,數據綁定樹模型。哪一個適合我的目的?

我怎樣纔能有效地解析這個JSON與傑克遜?我如何跳過這18個元素並跳到下一個陣列以獲得更好的性能?

編輯:(解決方案)

JacksonGSon都工作在幾乎相同的機制(增量模式,因爲內容被讀取和增量寫的),我切換到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(); 
+0

與GSON好運的文件,這是一個像樣的圖書館。然而,我並沒有看到wrt'skipValue()' - Jackson有'skipChildren()'這樣做,跳過了整個邏輯值(對於結構化值由多個標記組成)。 – StaxMan

回答

3

這是Jackson

關注this tutorial

明智地使用jasonParser.nextToken()會幫助你。

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

的僞代碼是

  1. 找到下一個陣列
    1. 讀取值
    2. 跳過其他值
    3. 跳過下一端令牌

這是用於gson。 看看this tutorial。考慮下面的教程第二個例子。

明智地使用reader.begin*reader.end*reader.skipValue應該爲你做這項工作。

這裏是爲JsonReader

+0

vai,謝謝你的回答!現在它工作!我編輯了我的答案並添加了我的解決方案,我終於使用了GSON。 –