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.