Iterieren über eine Instanz von org.json.JSONObject

1. Einleitung

In diesem Tutorial werden einige Ansätze zum Iterieren über ein JSONObject , eine einfache JSON-Darstellung für Java, vorgestellt.

Wir beginnen mit einer naiven Lösung und schauen uns dann etwas Robusteres an.

2. Durch ein JSONObject iterieren

Beginnen wir mit dem einfachen Fall des Iterierens eines JSON von Name-Wert-Paaren:

{ "name": "Cake", "cakeId": "0001", "cakeShape": "Heart" }

Dazu können wir die Schlüssel einfach mit der keys () -Methode durchlaufen :

void handleJSONObject(JSONObject jsonObject) { jsonObject.keys().forEachRemaining(key -> { Object value = jsonObject.get(key); logger.info("Key: {0}\tValue: {1}", key, value); } }

Und unser Output wird sein:

Key: name Value: Cake Key: cakeId Value: 0001 Key: cakeShape Value: Heart

3. Durchlaufen eines JSONObjects

Nehmen wir an, wir haben eine komplexere Struktur:

{ "batters": [ { "type": "Regular", "id": "1001" }, { "type": "Chocolate", "id": "1002" }, { "type": "BlueBerry", "id": "1003" } ], "name": "Cake", "cakeId": "0001" }

Was bedeutet in diesem Fall das Durchlaufen der Schlüssel?

Werfen wir einen Blick darauf, was uns unser naiver Schlüssel () -Ansatz geben würde:

Key: batters Value: [{"type":"Regular","id":"1001"},{"type":"Chocolate","id":"1002"}, {"type":"BlueBerry","id":"1003"}] Key: name Value: Cake Key: cakeId Value: 0001

Das ist vielleicht nicht ganz so hilfreich. In diesem Fall wollen wir anscheinend keine Iteration, sondern eine Durchquerung.

Das Durchlaufen eines JSONObject unterscheidet sich vom Durchlaufen des Schlüsselsatzes eines JSONObject .

Dazu müssen wir auch den Wertetyp überprüfen. Stellen wir uns vor, wir machen das in einer separaten Methode:

void handleValue(Object value) { if (value instanceof JSONObject) { handleJSONObject((JSONObject) value); } else if (value instanceof JSONArray) { handleJSONArray((JSONArray) value); } else { logger.info("Value: {0}", value); } }

Dann ist unser Ansatz immer noch ziemlich ähnlich:

void handleJSONObject(JSONObject jsonObject) { jsonObject.keys().forEachRemaining(key -> { Object value = jsonObject.get(key); logger.info("Key: {0}", key); handleValue(value); }); }

Das einzige ist, dass wir darüber nachdenken müssen, wie wir mit Arrays umgehen sollen.

4. Durchlaufen eines JSONArray

Versuchen wir, einen ähnlichen Ansatz wie bei der Verwendung eines Iterators beizubehalten. Anstatt keys () aufzurufen, rufen wir iterator () auf :

void handleJSONArray(JSONArray jsonArray) { jsonArray.iterator().forEachRemaining(element -> { handleValue(element) }); }

Diese Lösung ist jetzt einschränkend, da wir das Durchqueren mit der Aktion kombinieren, die wir ergreifen möchten . Ein üblicher Ansatz zur Trennung der beiden wäre die Verwendung des Besuchermusters.

5. Schlussfolgerung

In diesem Artikel haben wir eine Möglichkeit gesehen, ein JSONObject für einfache Name-Wert-Paare, das mit komplexen Strukturen verbundene Problem und eine Traversal-Technik zur Lösung zu durchlaufen .

Natürlich war dies eine Methode, bei der die Tiefe zuerst durchquert wurde, aber wir konnten die Breite zuerst auf ähnliche Weise durchführen.

Der vollständige Code für das Beispiel ist auf Github verfügbar.