Saya mengubah perpustakaan JSON saya dari org.json ke Jackson dan saya ingin memigrasi kode berikut:
JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray = datasets.getJSONArray("datasets");
Sekarang di Jackson saya memiliki yang berikut:
ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
Namun saya tidak suka pemeran di sana, apakah ada kemungkinan untuk a ClassCastException
? Apakah ada metode yang setara dengan getJSONArray
in org.json
sehingga saya memiliki penanganan kesalahan yang tepat jika itu bukan array?
FAIL_ON_UNKNOWN_PROPERTIES
untuk mendapatkan null yang dikembalikan di bidang yang tidak digunakan. Tapi itu tentu saja hanya sebuah pilihan jika set nama field relatif terbatas.Jawaban:
Ya, desain parser manual Jackson sangat berbeda dari pustaka lain. Secara khusus, Anda akan melihat bahwa
JsonNode
memiliki sebagian besar fungsi yang biasanya Anda kaitkan dengan node array dari API lain. Dengan demikian, Anda tidak perlu melakukan castArrayNode
untuk menggunakan. Berikut contohnya:JSON:
Kode:
Keluaran:
Perhatikan penggunaan
isArray
untuk memverifikasi bahwa node sebenarnya adalah array sebelum melakukan iterasi. Pemeriksaan tidak diperlukan jika Anda benar-benar yakin dengan struktur data Anda, tetapi tersedia jika Anda membutuhkannya (dan ini tidak berbeda dari kebanyakan pustaka JSON lainnya).sumber
Di Java 8 Anda bisa melakukannya seperti ini:
sumber
Itu tergantung pada masukan Anda; yaitu hal-hal yang Anda ambil dari URL. Jika nilai atribut "dataset" adalah array asosiatif daripada array biasa, Anda akan mendapatkan file
ClassCastException
.Tapi sekali lagi, kebenaran versi lama Anda juga tergantung pada masukannya. Dalam situasi di mana versi baru Anda melempar
ClassCastException
, versi lama akan melemparJSONException
. Referensi: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)sumber
Saya akan berasumsi pada akhirnya Anda ingin mengkonsumsi data di ArrayNode dengan mengulanginya. Untuk itu:
atau jika Anda menyukai fungsi stream dan lambda:
sumber