Foreach с JSONArray и JSONObject

Я использую 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);
}

Источник

Комментарии (7)
Решение

Очевидно, org.json.simple.JSONArray реализует сырой итератор. Это означает, что каждый элемент рассматривается как объект. Вы можете попытаться сделать кастинг:

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

Именно так все делалось в Java 1.4 и более ранних версиях.

Комментарии (2)

если вы используете Java 8, то вы можете использовать

import org.json.JSONArray;
import org.json.JSONObject;

JSONArray array = ...;

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

Добавил простой тест, чтобы доказать, что это работает:.

Добавьте следующую зависимость в ваш файл pom.xml (Чтобы доказать, что это работает, я использовал старый jar, который был там, когда я разместил этот ответ)


    org.json
    json
    20160810

И простым фрагментом тестового кода будет:

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"}
Комментарии (6)