2017-05-02 102 views
0

我試圖用json.simple從這個JSON文件得到的東西:Json解析:遍歷值?

"Main": { 
    "Part1":{ 
     "Length": 2, 
     "Flags": 2, 
     "Sequence": 4 
    }, 
    "Part2":{ 
     "Length": 2, 
     "Type":2, 
     "Main_Dest":4, 
     "Main_Source":4, 
     "Sequence":4, 
     "Data": { 
      "1":12, 
      "2":24 
     }, 
     "Blank": 8 
    } 
} 

基本上,我想達到第2部分「類型」值,並在途中的所有值相加。最後的含義我想要得到總和10(長度+標誌+序列+長度)和值「Type」的數字2。這裏我的主要問題是我必須一般地完成它,所以我不能通過名稱來收集值,因爲它們可能會更改或者可能會添加其他值。只有「Type」值纔會被正確調用。

什麼我迄今所做的是:

private static void parseJson() { 
    String path = "...config.json"; 
    boolean count = false; 
    int sum = 0; 
    try { 
     FileReader reader = new FileReader(path); 
     JSONParser jsonParser = new JSONParser(); 
     JSONObject jsonObject = (JSONObject) jsonParser.parse(reader); 
     jsonObject.entrySet(); 
     JSONObject main = (JSONObject) jsonObject.get("Main"); 
     for (Iterator iterator = main.keySet().iterator(); iterator.hasNext();){ 
      String key = (String) iterator.next(); 

      //this is where I'm stumped. Do I keep going into the JSONObject until I get to a value? 

      if (count){ 
       sum += (int) sahara.get(key); 
      } 
      if (key.equals("Type")){ 
       count = true; 
      } 

     } 
     System.out.println(skip); 
    } catch (Exception e) { 

    } 

} 

很顯然,我真的不知道我這個做。我如何迭代json文件中的最低級別?

作爲一個小問題,如果我可能銷售我的軟件,我應該使用哪個Json解析器庫?換句話說,哪些不會導致授權問題?

+0

您的示例沒有有效的JSON。兩個花括號缺失。 – ceving

回答

1

使用stream API for Json

我添加了缺少的大括號來修復您的輸入。

{ 
    "Main": { 
    "Part1":{ 
     "Length": 2, 
     "Flags": 2, 
    "Sequence": 4 
    }, 
    "Part2":{ 
     "Length": 2, 
     "Type":2, 
     "Main_Dest":4, 
     "Main_Source":4, 
     "Sequence":4, 
     "Data": { 
     "1":12, 
     "2":24 
     }, 
     "Blank": 8 
    } 
    } 
} 

此示例顯示如何使用流API。

// -*- compile-command: "javac -cp javax.json-1.0.jar q43737601.java && java -cp .:javax.json-1.0.jar q43737601"; -*- 

import java.io.FileReader; 
import javax.json.Json; 
import javax.json.stream.JsonParser; 

class q43737601 
{ 
    public static void main (String argv[]) throws Exception 
    { 
    String path = "config.json"; 
    int sum = 0; 

    JsonParser p = Json.createParser (new FileReader (path)); 
    while (p.hasNext()) { 
     JsonParser.Event e = p.next(); 
     switch (e) { 
     case VALUE_NUMBER: 
     sum += Integer.parseInt(p.getString()); 
     break; 
     case KEY_NAME: 
     if ("Type".equals(p.getString())) 
      System.out.println(sum); 
     break; 
     } 
    } 
    } 
} 

如果你運行它,它會顯示10的例子總結了所有數字達到了一個名爲「類型」鍵。

我嘗試了OpenJDK的上述例子。有必要按照this答案中所述的步驟進行操作。我不得不在編譯命令中設置類路徑(-cp)。

+0

恐怕我不明白您發佈的鏈接中的說明。 當我按原樣運行代碼時,輸​​出是:10 46 93 118 我必須使用OpenJDK嗎? – banzai

+0

如果它打印的不止10個,則使用不同的輸入文件。正如你所看到的,代碼在第一個「類型」鍵後不會停止。如果你想停止,你必須在打印總和後添加一個'return'或'exit'。你不需要OpenJDK。我已經使用OpenJDK作爲例子。文檔(第一鏈接)如果來自Oracle。 – ceving

2

你可以遞歸迭代鍵,但是你不能計算總和,結果將是不可預測的。

jsonObject.keySet不保證以與文件中出現的順序相同的順序返回鍵。