Ben org.json.simple.JSONArray
ve org.json.simple.JSONObject
kullanıyorum. Bu iki sınıfın JSONArray
ve JSONObject
uyumsuz olduğunu biliyorum, ancak yine de oldukça doğal bir şey yapmak istiyorum - her yineleme adımında bir JSONObject
(bu JSONArray
içinde yuvalanmış) ayrıştıran JSONArray
üzerinde for-each yapmak istiyorum. Bunu şu şekilde yapmaya çalışıyorum:
JSONArray arr = ...; // <-- got by some procedure
for(JSONObject o: arr){
parse(o);
}
Bu kodu derlemeye çalıştığımda, çok doğal görünmesine rağmen "incompatible types" hatası alıyorum. Sorum şu: JSONArray
üzerinden yineleme yapmanın en iyi yolu nedir?
Görünüşe göre JSONArray
içinde for each
ile yineleme yapamazsınız. JSONArray` içinde şu şekilde döngü yapabilirsiniz:
for (int i=0; i < arr.length(); i++) {
arr.getJSONObject(i);
}
Görünüşe göre, org.json.simple.JSONArray
bir raw Iterator uygulamaktadır. Bu, her öğenin bir Object
olarak kabul edildiği anlamına gelir. Döküm yapmayı deneyebilirsiniz:
for(Object o: arr){
if ( o instanceof JSONObject ) {
parse((JSONObject)o);
}
}
Java 1.4 ve öncesinde işler bu şekilde yapılıyordu.
Java 8 kullanıyorsanız
import org.json.JSONArray;
import org.json.JSONObject;
JSONArray array = ...;
array.forEach(item -> {
JSONObject obj = (JSONObject) item;
parse(obj);
});
Çalıştığını kanıtlamak için basit bir test ekledim:
Aşağıdaki bağımlılığı pom.xml
dosyanıza ekleyin (Çalıştığını kanıtlamak için, bu cevabı gönderdiğimde orada olan eski kavanozu kullandım)
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
Ve basit test kodu parçacığı şöyle olacaktır:
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());
});
}
}
Çıktı:
{"key1":"value1"}