JSONArrayとJSONObjectを使ったForeach

私は org.json.simple.JSONArrayorg.json.simple.JSONObject を使用しています。JSONArrayJSONObjectは互換性がないことは分かっていますが、ごく当たり前のことをしたいのです。つまり、JSONArrayを for-each して、各反復ステップで一つのJSONObject(JSONArray` の内部に入れ子) をパースしたいのです。私はそれを次のようにしようとします。

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

このコードをコンパイルしようとすると、とても自然に見えるにもかかわらず、確かに "incompatible types" というエラーが表示されます。そこで質問ですが、JSONArrayを繰り返し処理する最良の方法は何でしょうか?

JSONArrayfor eachで反復処理することはできないようです。このようにJSONArray` をループさせることができます。

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

ソース

解説 (7)
ソリューション

どうやら、 org.json.simple.JSONArrayraw イテレータを実装しているようです。これは、各要素が Object と見なされることを意味します。キャストしてみてください。

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)