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.