Iterering over en instans af org.json.JSONObject

1. Introduktion

I denne vejledning ser vi på et par tilgange til iterering over en JSONObjekt, en simpel JSON-repræsentation til Java.

Vi starter med en naiv løsning og ser derefter på noget lidt mere robust.

2. Iterering gennem en JSONObjekt

Lad os starte med det enkle tilfælde af iterering af en JSON af navn-værdipar:

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

Til dette kan vi simpelthen gentages gennem tasterne ved hjælp af nøgler () metode:

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

Og vores output vil være:

Nøgle: navn Værdi: Kage Nøgle: cakeId Værdi: 0001 Nøgle: kage Form Værdi: Hjerte

3. Kørsel gennem en JSONObjekt

Men lad os sige, at vi har en mere kompleks struktur:

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

Hvad betyder iterering gennem tasterne i dette tilfælde?

Lad os se på, hvad vores naive er nøgler () tilgang ville give os:

Key: batters Værdi: [{"type": "Regular", "id": "1001"}, {"type": "Chocolate", "id": "1002"}, {"type": "BlueBerry" , "id": "1003"}] Nøgle: navn Værdi: Kage Nøgle: cakeId Værdi: 0001

Dette er måske ikke lige så nyttigt. Det ser ud som hvad vi ønsker i dette tilfælde er ikke iteration, men i stedet traversal.

Kører gennem en JSONObjekt er forskellig fra iterering gennem a JSONObjekt'S nøglesæt.

For det, vi skal faktisk også kontrollere værditypen. Lad os forestille os, at vi gør dette i en separat metode:

ugyldig handleValue (objektværdi) {hvis (værdi instans af JSONObject) {handleJSONObject ((JSONObject) værdi); } ellers hvis (værdi instans af JSONArray) {handleJSONArray ((JSONArray) værdi); } andet {logger.info ("Værdi: {0}", værdi); }}

Derefter er vores tilgang stadig ret ens:

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

Det eneste er, at vi skal tænke på, hvordan vi håndterer arrays.

4. Kørsel gennem en JSONArray

Lad os prøve at holde en lignende tilgang til at bruge en iterator. I stedet for at ringe nøgler ()Men vi ringer iterator ():

ugyldigt håndtagJSONArray (JSONArray jsonArray) {jsonArray.iterator (). forEachRemaining (element -> {handleValue (element)}); }

Nu er denne løsning begrænsende, fordi vi kombinerer traversal med den handling, vi ønsker at tage. En almindelig tilgang til at adskille de to ville være at bruge besøgende mønster.

5. Konklusion

I denne artikel så vi en måde at gentage over en JSONObjekt for enkle navneværdipar, problemet forbundet med komplekse strukturer og en gennemgribende teknik til at løse det.

Selvfølgelig, dette var en dybde-første traversal metode, men vi kunne gøre bredde-først på en lignende måde.

Den komplette kode for eksemplet er tilgængelig på Github.