Iterasi pada Instance org.json.JSONObject

1. Perkenalan

Dalam tutorial ini, kita akan melihat beberapa pendekatan untuk iterasi JSONObject , representasi JSON sederhana untuk Java.

Kami akan mulai dengan solusi yang naif dan kemudian melihat sesuatu yang sedikit lebih kuat.

2. Iterasi Melalui JSONObject

Mari kita mulai dengan kasus sederhana dari iterasi JSON pasangan nama-nilai:

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

Untuk ini, kita cukup melakukan iterasi melalui kunci menggunakan metode keys () :

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

Dan output kami adalah:

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

3. Melintasi JSONObject

Tetapi katakanlah kita memiliki struktur yang lebih kompleks:

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

Apa artinya iterasi melalui kunci dalam kasus ini?

Mari kita lihat apa yang akan diberikan oleh pendekatan naive keys () kepada kita:

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

Ini, mungkin, tidak terlalu membantu. Sepertinya yang kita inginkan dalam hal ini bukanlah iterasi, melainkan traversal.

Melintasi JSONObject berbeda dengan iterasi melalui kumpulan kunci JSONObject .

Untuk ini, kita juga perlu memeriksa tipe nilainya. Bayangkan kita melakukan ini dalam metode terpisah:

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); } }

Kemudian, pendekatan kami masih cukup mirip:

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

Satu-satunya hal adalah kita perlu memikirkan tentang bagaimana menangani array.

4. Melintasi JSONArray

Mari kita coba dan pertahankan pendekatan serupa dalam menggunakan iterator. Alih-alih memanggil kunci () , kita akan memanggil iterator () :

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

Sekarang, solusi ini membatasi karena kami menggabungkan traversal dengan tindakan yang ingin kami lakukan . Pendekatan umum untuk memisahkan keduanya akan menggunakan pola Pengunjung.

5. Kesimpulan

Dalam artikel ini, kami melihat cara untuk mengulang JSONObject untuk pasangan nama-nilai sederhana, masalah yang terkait dengan struktur kompleks, dan teknik traversal untuk menyelesaikannya.

Tentu saja, ini adalah metode penjelajahan pertama kedalaman, tetapi kami dapat melakukan penelusuran luas terlebih dahulu dengan cara yang serupa.

Kode lengkap untuk contoh tersedia di Github.