2015-10-19 1120 views
2

我使用org.json.simple.JSONArrayorg.json.simple.JSONObject。我知道這兩個類JSONArrayJSONObject是不兼容的,但我仍然想做一個很自然的事情 - 我想爲 - 每個JSONArray解析在每個迭代步驟一個JSONObject(嵌套在JSONArray內)。我嘗試做它像這樣:帶有JSONArray和JSONObject的Foreach

JSONArray arr = ...; // <-- got by some procedure 
for(JSONObject o: arr){ 
    parse(o); 
} 

當我嘗試編譯這段代碼,我確實得到「不兼容的類型」錯誤,即使它看起來那麼自然。所以,我的問題是通過JSONArray迭代的最佳方式是什麼?

回答

14

顯然,org.json.simple.JSONArray實現原料迭代器。這意味着每個元素都被認爲是Object。您可以嘗試投射:

for(Object o: arr){ 
    if (o instanceof JSONObject) { 
     parse((JSONObject)o); 
    } 
} 

這是在Java 1.4及更早版本中完成的事情。

+0

謝謝!有用。雖然,它似乎是我用'java.util.Iterator'做的 – Jacobian

+0

@Jacobian是的,它是'java.util.Iterator',但它是一個* raw *(例如'List '將返回一個'Iterator ',然後你可以使用'String'作爲增強的for循環變量的類型,當它是raw時,基類型被認爲是'Object'。 – RealSkeptic

+0

謝謝!我明白了! – Jacobian

10

看起來像你不能通過JSONArrayfor each迭代。可以遍歷您的JSONArray這樣的:

for (int i=0; i < arr.length(); i++) { 
    arr.getJSONObject(i); 
} 

Source

+0

謝謝!將在一秒鐘內檢查它。 – Jacobian

+0

不幸的是,它看起來像'org.json.simple。*'中的'JSONArray'沒有'length()'方法和'getJSONObject()' – Jacobian

+0

@Jacobian您是否嘗試過使用'org.json.JSONArray'? – dguay

7

,如果你使用的是Java 8則可以使用

JSONArray array = ...; 

array.forEach(item -> { 
    JSONObject obj = (JSONObject) item; 
    parse(obj); 
}); 
+0

如果使用[retrolambda] (http://www.vogella.com/tutorials/Retrolambda/article.html)用java 7 – Fonix

+0

這個方法forEach(( item) - > {})對於 類型是未定義的JSONArray – Prakhyat

+0

這不再有效。它是如何在Java 8中完成的:https://stackoverflow.com/questions/42854505/how-to-iterate-over-a-jsonarray-in-java-8 – akcasoy