Itereren over een instantie van org.json.JSONObject

1. Inleiding

In deze zelfstudie bekijken we een aantal benaderingen voor het herhalen van een JSONObject, een eenvoudige JSON-weergave voor Java.

We beginnen met een naïeve oplossing en kijken dan naar iets robuuster.

2. Itereren door een JSONObject

Laten we beginnen met het simpele geval van het herhalen van een JSON van naam-waardeparen:

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

Hiervoor kunnen we eenvoudig doorloop de toetsen met behulp van de sleutels () methode:

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

En onze output zal zijn:

Key: name Waarde: Cake Key: cakeId Waarde: 0001 Sleutel: cakeShape Waarde: Heart

3. Doorkruisen door een JSONObject

Maar laten we zeggen dat we een complexere structuur hebben:

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

Wat betekent in dit geval het herhalen van de toetsen?

Laten we eens kijken wat onze naïef is sleutels () aanpak zou ons geven:

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

Dit is misschien niet zo nuttig. Het lijkt wat we willen in dit geval geen iteratie, maar in plaats daarvan traversal.

Door een JSONObject verschilt van itereren door een JSONObject'S sleutelset.

Voor deze, we moeten eigenlijk ook het waardetype controleren. Laten we ons voorstellen dat we dit op een aparte methode doen:

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

Dan is onze aanpak nog redelijk vergelijkbaar:

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

Het enige is dat we moeten nadenken over het omgaan met arrays.

4. Doorkruisen door een JSONArray

Laten we proberen een vergelijkbare benadering te behouden door een iterator te gebruiken. In plaats van te bellen sleutels ()maar we zullen bellen iterator ():

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

Nu is deze oplossing beperkend omdat we combineren traversal met de actie die we willen ondernemen. Een gebruikelijke benadering om de twee te scheiden is het gebruik van het bezoekerspatroon.

5. Conclusie

In dit artikel hebben we een manier gezien om een JSONObject voor eenvoudige naam-waardeparen, het probleem dat samenhangt met complexe structuren, en een doorlooptechniek om het op te lossen.

Natuurlijk, dit was een diepte-eerst-traversale methode, maar we konden breedte-eerst doen op een soortgelijke manier.

De volledige code voor het voorbeeld is beschikbaar op Github.