2015-10-19 1100 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