Iterálás egy org.json.JSONObject példány felett

1. Bemutatkozás

Ebben az oktatóanyagban megnézünk néhány megközelítést az a felett történő iterációhoz JSONObject, egy egyszerű JSON-ábrázolás a Java számára.

Kezdjük egy naiv megoldással, majd megvizsgálunk egy kicsit robusztusabb dolgot.

2. Iterálás a JSONObject

Kezdjük azzal az egyszerű esettel, hogy a név-érték párok JSON-ját iteráljuk:

{"name": "Cake", "cakeId": "0001", "cakeShape": "Szív"}

Ehhez egyszerűen megtehetjük iterálni a billentyűkön keresztül a kulcsok() módszer:

void handleJSONObject (JSONObject jsonObject) {jsonObject.keys (). forEachRemaining (kulcs -> {Objektum értéke = jsonObject.get (kulcs); logger.info ("Kulcs: {0} \ tValue: {1}", kulcs, érték );}}

És a kimenetünk a következő lesz:

Kulcs: név Érték: Torta Kulcs: cakeId Érték: 0001 Kulcs: cakeShape Érték: Szív

3. Áthaladás a JSONObject

De tegyük fel, hogy összetettebb szerkezetünk van:

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

Mit jelent ebben az esetben a billentyűkön keresztüli iteráció?

Vessünk egy pillantást arra, hogy mi a naiv kulcsok() megközelítés adna nekünk:

Kulcs: batters Érték: [{"type": "Regular", "id": "1001"}, {"type": "Chocolate", "id": "1002"}, {"type": "BlueBerry" , "id": "1003"}] Kulcs: név Érték: Torta Kulcs: cakeId Érték: 0001

Ez talán nem annyira hasznos. Úgy tűnik, mi szeretnénk ebben az esetben nem az iterációt, hanem a bejárást.

Áthaladás a JSONObject különbözik az a-on keresztüli iterációtól JSONObject’S kulcskészlet.

Ezért, valójában ellenőriznünk kell az érték típusát is. Képzeljük el, hogy ezt külön módszerrel tesszük:

void handleValue (Objektumérték) {if (a JSONObject értékpéldánya) {handleJSONObject ((JSONObject) érték); } else if (JSONArray értékpéldánya) {handleJSONArray ((JSONArray) érték); } else {logger.info ("Érték: {0}", érték); }}

Akkor a mi megközelítésünk továbbra is meglehetősen hasonló:

void handleJSONObject (JSONObject jsonObject) {jsonObject.keys (). forEachRemaining (kulcs -> {Objektum értéke = jsonObject.get (kulcs); logger.info ("Kulcs: {0}", kulcs); handleValue (érték);} ); }

Az egyetlen dolog, hogy gondolkodnunk kell a tömbök kezelésén.

4. Áthaladás a JSONArray

Próbálkozzunk az iterátor használatának hasonló megközelítésével. Hívás helyett kulcsok()bár hívunk iterátor ():

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

Ez a megoldás azért korlátozó, mert ötvözzük a bejárást a meg akarunk tenni. A kettő elválasztásának általános megközelítése a Látogató minta használata.

5. Következtetés

Ebben a cikkben megismertük a módját az a JSONObject az egyszerű név-érték párok esetében a bonyolult szerkezetekhez kapcsolódó probléma és annak megoldására szolgáló bejárási technika.

Természetesen, ez egy mélység-első bejárási módszer volt, de először is megtehettük hasonló módon.

A példa teljes kódja elérhető a Github oldalon.