Итериране над екземпляр на org.json.JSONObject

1. Въведение

В този урок ще разгледаме няколко подхода за итерация през JSONObject , просто представяне на JSON за Java.

Ще започнем с наивно решение и след това ще разгледаме нещо малко по-стабилно.

2. Итерация през JSONObject

Нека започнем с простия случай на итерация на JSON от двойки име-стойност:

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

За това можем просто да прегледаме ключовете, използвайки метода keys () :

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

И нашата продукция ще бъде:

Key: name Value: Cake Key: cakeId Value: 0001 Key: cakeShape Value: Heart

3. Преминаване през JSONObject

Но да кажем, че имаме по-сложна структура:

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

Какво означава итерация през клавишите в този случай?

Нека да разгледаме какво би ни дал подходът ни с наивни ключове () :

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

Това може би не е толкова полезно. Изглежда, че това, което искаме в този случай, не е итерация, а обръщане.

Преминаването през JSONObject се различава от итерацията през набора ключове на JSONObject .

За това всъщност трябва да проверим и типа стойност. Нека си представим, че правим това по отделен метод:

void handleValue(Object value) { if (value instanceof JSONObject) { handleJSONObject((JSONObject) value); } else if (value instanceof JSONArray) { handleJSONArray((JSONArray) value); } else { logger.info("Value: {0}", value); } }

Тогава нашият подход все още е доста сходен:

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

Единственото нещо е, че трябва да помислим как да боравим с масиви.

4. Преминаване през JSONArray

Нека се опитаме да запазим подобен подход при използване на итератор. Вместо да извикваме ключове () , обаче, ще извикаме iterator () :

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

Сега това решение е ограничаващо, защото комбинираме обхода с действието, което искаме да предприемем . Често срещан подход за разделяне на двете ще бъде използването на шаблон Visitor.

5. Заключение

В тази статия видяхме начин за итерация над JSONObject за прости двойки име-стойност, проблема, свързан със сложни структури, и обходна техника за решаването му.

Разбира се, това беше метод за обхождане първо в дълбочина, но ние можехме да направим ширина първо по подобен начин.

Пълният код за примера е достъпен на Github.