Ich'm mit org.json.simple.JSONArray
und org.json.simple.JSONObject
. Ich weiß, dass diese beiden Klassen JSONArray
und JSONObject
inkompatibel sind, aber trotzdem möchte ich eine ganz natürliche Sache machen - ich möchte for-each über JSONArray
parsen und bei jedem Iterationsschritt ein JSONObject
(verschachtelt in diesem JSONArray
). Ich versuche, es so zu machen:
JSONArray arr = ...; // <-- got by some procedure
for(JSONObject o: arr){
parse(o);
}
Wenn ich versuche, diesen Code zu kompilieren, erhalte ich tatsächlich die Fehlermeldung "incompatible types", obwohl es so natürlich aussieht. Also, meine Frage ist, was ist der beste Weg, um durch JSONArray
zu iterieren?
Es sieht so aus, als ob Sie nicht durch JSONArray
mit einem for each
iterieren können. Sie können durch Ihr JSONArray
wie folgt durchlaufen:
for (int i=0; i < arr.length(); i++) {
arr.getJSONObject(i);
}
Offensichtlich implementiert org.json.simple.JSONArray
einen raw Iterator. Das bedeutet, dass jedes Element als Objekt
betrachtet wird. Sie können versuchen zu casten:
for(Object o: arr){
if ( o instanceof JSONObject ) {
parse((JSONObject)o);
}
}
So wurden die Dinge in Java 1.4 und früher gehandhabt.
wenn Sie Java 8 verwenden, können Sie
import org.json.JSONArray;
import org.json.JSONObject;
JSONArray array = ...;
array.forEach(item -> {
JSONObject obj = (JSONObject) item;
parse(obj);
});
Ich habe gerade einen einfachen Test hinzugefügt, um zu beweisen, dass es funktioniert:
Fügen Sie die folgende Abhängigkeit in Ihre pom.xml
Datei ein (Um zu beweisen, dass es funktioniert, habe ich das alte jar verwendet, das da war, als ich diese Antwort geschrieben habe)
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
Und der einfache Test-Code-Schnipsel wird sein:
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());
});
}
}
Ausgabe:
{"key1":"value1"}