Iterere over en forekomst av org.json.JSONObject

1. Introduksjon

I denne opplæringen vil vi se på et par tilnærminger for iterering over en JSONObject, en enkel JSON-representasjon for Java.

Vi starter med en naiv løsning og ser på noe litt mer robust.

2. Iterere gjennom en JSONObject

La oss starte med det enkle tilfellet å itere en JSON av navn-verdi-par:

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

For dette kan vi ganske enkelt gjenta det gjennom tastene ved hjelp av nøkler () metode:

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

Og vår produksjon vil være:

Nøkkel: navn Verdi: Kake Nøkkel: cakeId Verdi: 0001 Nøkkel: kake Form Verdi: Hjerte

3. Å krysse gjennom en JSONObject

Men la oss si at vi har en mer kompleks struktur:

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

Hva betyr iterering gjennom tastene i dette tilfellet?

La oss ta en titt på hva våre naive nøkler () tilnærming vil gi oss:

Key: batters Verdi: [{"type": "Regular", "id": "1001"}, {"type": "Chocolate", "id": "1002"}, {"type": "BlueBerry" , "id": "1003"}] Nøkkel: navn Verdi: Kake Nøkkel: cakeId Verdi: 0001

Dette er kanskje ikke like nyttig. Det virker som hva vi ønsker i dette tilfellet er ikke iterasjon, men i stedet traversal.

Å krysse gjennom en JSONObject er forskjellig fra å gjenta gjennom en JSONObject’S nøkkel sett.

For dette, vi må faktisk sjekke verditypen også. La oss forestille oss at vi gjør dette i en egen metode:

void handleValue (Object value) {if (value instanceof JSONObject) {handleJSONObject ((JSONObject) value); } annet hvis (verdi forekomst av JSONArray) {handleJSONArray ((JSONArray) verdi); } annet {logger.info ("Verdi: {0}", verdi); }}

Så er vår tilnærming fortsatt ganske lik:

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

Det eneste er at vi må tenke på hvordan vi skal håndtere matriser.

4. Traversing Through a JSONArray

La oss prøve å beholde en lignende tilnærming når det gjelder å bruke en iterator. I stedet for å ringe nøkler ()men vi ringer iterator ():

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

Nå er denne løsningen begrensende fordi vi kombinerer traversal med handlingen vi ønsker å ta. En vanlig tilnærming til å skille de to ville være å bruke besøksmønsteret.

5. Konklusjon

I denne artikkelen så vi en måte å gjenta over en JSONObject for enkle navn-verdipar, problemet forbundet med komplekse strukturer, og en traversal teknikk for å løse det.

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

Den komplette koden for eksemplet er tilgjengelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found