Ich verwende eine JSON-Bibliothek namens JSONObject
(es macht mir nichts aus, zu wechseln, wenn ich muss).
Ich weiß, wie man iteriert JSONArrays
, aber wenn ich JSON-Daten von Facebook analysiere, erhalte ich kein Array, nur ein JSONObject
, aber ich muss in der Lage sein, über seinen Index auf ein Element zuzugreifen, z. B. JSONObject[0]
um das erste zu erhalten, und ich Ich kann nicht herausfinden, wie es geht.
{
"http://http://url.com/": {
"id": "http://http://url.com//"
},
"http://url2.co/": {
"id": "http://url2.com//",
"shares": 16
}
,
"http://url3.com/": {
"id": "http://url3.com//",
"shares": 16
}
}
Antworten:
Vielleicht hilft das:
quelle
JSONObject
sind ungeordnet und Ihre Behauptung war eine einfache Widerspiegelung einer privaten Implementierung;)for (String key : keys)
Für meinen Fall fand ich es gut, die
names()
Arbeiten zu wiederholenquelle
Iterating
in Java verstanden wird, funktioniert es recht gut! Vielen Dank.Ich werde Iteratoren vermeiden, da sie während der Iteration Objekte hinzufügen / entfernen können, auch für die Verwendung von sauberem Code für die Schleife. Es wird einfach sauber sein und weniger Leitungen.
Verwenden von Java 8 und Lamda [Update 02.04.2019]
Auf alte Weise [Update 02.04.2019]
Ursprüngliche Antwort
quelle
Ich kann nicht glauben, dass es keine einfachere und sicherere Lösung gibt, als einen Iterator in diesen Antworten zu verwenden ...
Die JSONObject-
names ()
Methode gibt einenJSONArray
derJSONObject
Schlüssel zurück, sodass Sie ihn einfach in einer Schleife durchlaufen können:quelle
JSONObject
. So etwas wieJSONObject object = new JSONObject ("{\"key1\",\"value1\"}");
. Aber setzen Sie kein rohes JSON ein, sondern fügen Sie Elemente mit derput ()
Methode hinzu :object.put ("key1", "value1");
.quelle
jsonChildObject = iterator.next();
sollte wohl definierenjsonChildObject
, wieJSONObject jsonChildObject = iterator.next();
nein?Iterator<JSONObject>
gibt eine Warnung. Ich würde es durch das Generikum ersetzen<?>
und den Anruf an besetzennext()
. Außerdem würde ich verwenden,getString("id")
anstattget("id")
eine Besetzung zu speichern.org.json.JSONObject verfügt jetzt über eine keySet () -Methode, die a zurückgibt
Set<String>
und leicht mit einem for-each durchlaufen werden kann.quelle
Stellen Sie dies zuerst irgendwo hin:
Oder wenn Sie Zugriff auf Java8 haben, einfach Folgendes:
Dann iterieren Sie einfach über die Schlüssel und Werte des Objekts:
quelle
Ich habe eine kleine rekursive Funktion erstellt, die das gesamte JSON-Objekt durchläuft und den Schlüsselpfad und seinen Wert speichert.
quelle
Mit Java 8 und Lambda sauberer:
https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#forEachRemaining-java.util.function.Consumer-
quelle
Wir haben den folgenden Codesatz verwendet, um
JSONObject
Felder zu durchlaufenquelle
Ich hatte einmal einen JSON mit IDs, die um eins erhöht werden mussten, da sie 0-indiziert waren und das automatische Inkrementieren von MySQL unterbrach.
Also für jedes Objekt habe ich diesen Code geschrieben - könnte für jemanden hilfreich sein:
Verwendungszweck:
Dies kann so transformiert werden, dass es auch für JSONArray als übergeordnetes Objekt funktioniert
quelle
Die meisten Antworten beziehen sich auf flache JSON-Strukturen. Wenn Sie einen JSON haben, der möglicherweise verschachtelte JSONArrays oder verschachtelte JSONObjects enthält, entsteht die tatsächliche Komplexität. Das folgende Code-Snippet kümmert sich um eine solche Geschäftsanforderung. Es benötigt eine Hash-Map und hierarchisches JSON mit verschachtelten JSONArrays und JSONObjects und aktualisiert das JSON mit den Daten in der Hash-Map
Sie müssen hier beachten, dass der Rückgabetyp ungültig ist, aber sice-Objekte als Referenz übergeben werden. Diese Änderung wird erneut an den Aufrufer ausgewählt.
quelle
Der folgende Code hat für mich gut funktioniert. Bitte helfen Sie mir, wenn eine Abstimmung durchgeführt werden kann. Dadurch werden alle Schlüssel auch von den verschachtelten JSON-Objekten abgerufen.
quelle
Dies ist eine weitere funktionierende Lösung für das Problem:
quelle