Berterusan Mengenai Instance org.json.JSONObject

1. Pengenalan

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

Kita akan mulakan dengan penyelesaian naif dan kemudian melihat sesuatu yang lebih mantap.

2. Pengulangan Melalui Objek JSON

Mari kita mulakan dengan kes mudah untuk mengulang JSON pasangan nilai-nilai:

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

Untuk ini, kita boleh melakukan iterasi melalui kunci menggunakan kaedah kunci () :

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 Objektif JSON

Tetapi katakan bahawa kita mempunyai struktur yang lebih kompleks:

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

Apa maksud lelaran melalui kunci dalam kes ini?

Mari kita lihat apa yang akan diberikan oleh pendekatan kunci naif kita 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 begitu membantu. Nampaknya apa yang kita mahukan dalam kes ini bukanlah lelaran, tetapi melintasi.

Menyeberangi melalui JSONObject adalah berbeza daripada iterating melalui JSONObject set kunci 's.

Untuk ini, kita juga perlu memeriksa jenis nilai. Bayangkan kita melakukan ini dengan kaedah yang berasingan:

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 serupa:

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

Satu-satunya perkara ialah kita perlu memikirkan bagaimana menangani tatasusunan.

4. Melintasi Melalui JSONArray

Mari cuba dan gunakan pendekatan yang sama menggunakan iterator. Daripada memanggil kunci () , kami akan memanggil iterator () :

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

Sekarang, penyelesaian ini sangat terhad kerana kita menggabungkan traversal dengan tindakan yang ingin kita lakukan . Pendekatan umum untuk memisahkan keduanya adalah menggunakan corak Pelawat.

5. Kesimpulan

Dalam artikel ini, kami melihat cara untuk melakukan iterasi atas JSONObjek untuk pasangan nilai-nama yang mudah, masalah yang berkaitan dengan struktur kompleks, dan teknik melintasi untuk menyelesaikannya.

Sudah tentu, ini adalah kaedah melintasi kedalaman pertama, tetapi kita dapat melakukan yang pertama dengan cara yang serupa.

Kod lengkap untuk contoh boleh didapati di Github.