Я использую org.json.simple.JSONArray
и org.json.simple.JSONObject
. Я знаю, что эти два класса JSONArray
и JSONObject
несовместимы, но все же я хочу сделать вполне естественную вещь - я хочу, чтобы for-each над JSONArray
разбирал на каждом шаге итерации один JSONObject
(вложенный внутрь этого JSONArray
). Я пытаюсь сделать это следующим образом:
JSONArray arr = ...; // <-- got by some procedure
for(JSONObject o: arr){
parse(o);
}
Когда я пытаюсь скомпилировать этот код, то действительно получаю "несовместимые типы" ошибку, хотя это выглядит так естественно. Итак, мой вопрос в том, какой лучший способ итерации через JSONArray
?
Похоже, что вы не можете выполнять итерации по JSONArray
с помощью for each
. Вы можете перебирать JSONArray
следующим образом:
for (int i=0; i < arr.length(); i++) {
arr.getJSONObject(i);
}
Очевидно, org.json.simple.JSONArray
реализует сырой итератор. Это означает, что каждый элемент рассматривается как объект
. Вы можете попытаться сделать кастинг:
for(Object o: arr){
if ( o instanceof JSONObject ) {
parse((JSONObject)o);
}
}
Именно так все делалось в Java 1.4 и более ранних версиях.
если вы используете Java 8, то вы можете использовать
import org.json.JSONArray;
import org.json.JSONObject;
JSONArray array = ...;
array.forEach(item -> {
JSONObject obj = (JSONObject) item;
parse(obj);
});
Добавил простой тест, чтобы доказать, что это работает:.
Добавьте следующую зависимость в ваш файл pom.xml
(Чтобы доказать, что это работает, я использовал старый jar, который был там, когда я разместил этот ответ)
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
И простым фрагментом тестового кода будет:
import org.json.JSONArray;
import org.json.JSONObject;
public class Test {
public static void main(String args[]) {
JSONArray array = new JSONArray();
JSONObject object = new JSONObject();
object.put("key1", "value1");
array.put(object);
array.forEach(item -> {
System.out.println(item.toString());
});
}
}
вывод:
{"key1":"value1"}