Halo gaes, kali ini saya ingin berbagi tentang kasus saat pertama kali bermain object json di Android Studio. Katakanlah saya sedang mengerjakan aplikasi android yang mendapatkan konten json dari layanan web yang disebut "WebUntis". Konten Json itu terlihat seperti ini.
{"jsonrpc":"2.0","id":"req-002",
"result":[
{"id":125043,"date":20110117,"startTime":800,"endTime":850,
"kl":[{"id":71}],
"te":[{"id":23}],
"su":[{"id":13}],
"ro":[{"id":1}]},
{"id":125127,"date":20110117,"startTime":1055,"endTime":1145,
"kl":[{"id":71}],
"te":[{"id":41}],
"su":[{"id":19}],
"ro":[{"id":31}]},
]}

Seperti yang Anda lihat, ada juga array lain seperti "id", "kl", "te", "su" dan "ro". Manakala konten array itu berisi data, maka saya dengan lancar dapat menyimpannya ke sebuah ArrayList. Tapi ketika salah satu saja dari array-array tersebut kosong, seperti ini (perhatikan "kl"),
{"jsonrpc":"2.0","id":"req-002",
"result":[
{"id":125043,"date":20110117,"startTime":800,"endTime":850,
"**kl":[]**,
"te":[{"id":23}],
"su":[{"id":13}],
"ro":[{"id":1}]},
{"id":125127,"date":20110117,"startTime":1055,"endTime":1145,
"kl":[{"id":71}],
"te":[{"id":41}],
"su":[{"id":19}],
"ro":[{"id":31}]},
]}
Maka yang terjadi adalah saya selalu mendapati error: IndexOutOfRangeException, sehingga solusi sementara saat itu adalah saya minta divisi web memberikan nilai khusus jika memang tidak terdapat data, saya tahu ini konyol sekali, maklumlah namanya juga baru belajar. Kira-kira seperti inilah kodenya saat itu.
JSONObject jsonResult = new JSONObject(s);
// Get the result object
JSONArray arr = jsonResult.getJSONArray("result");
for (int i = 0; i < arr.length(); i++) {
JSONObject c = arr.getJSONObject(i);
anfangStunde[i] = c.getString("startTime");
endeStunde[i] = c.getString("endTime");
// get the jsonarrays (kl, su, ro)
kl = c.getJSONArray("kl");
su = c.getJSONArray("su");
ro = c.getJSONArray("ro");
// check if kl is not null
if(kl != null){
klassenID[i] = kl.getJSONObject(0).getString("id");
}
if (klassenID[i] != null) {
klasse = webuntis.klassenMap.get(klassenID[i]);
Log.d("ID und Klasse=", "" + klassenID[i] + ";" + klasse);
}
// get th ids
fachID[i] = su.getJSONObject(0).getString("id");
if (fachID[i] != null) {
fach = webuntis.faecherMap.get(fachID[i]);
Log.d("ID und Fach=", "" + fachID[i] + ";" + fach);
}
// "Start;Ende;Klasse;Fach;Raum" store in arraylist
webuntis.stundenPlan.add(anfangStunde[i] + ";" + endeStunde[i] + ";" + klasse + ";" + fach);
// Write Data into a file for offline use:
}
Tentu saya tidak membiarkannya begitu saja, seiring berjalannya waktu saya terus melakukan improvisasi pada kode tersebut dan poinnya adalah,
1. Jika array didefinisikan dalam file empty, seperti.
...
"kl":[]
...
2. Kemudian getJSONArray("kl") akan mengembalikan array bernilai "empty", tetapi perlu kamu sadari bahwa array tersebut tidak berarti "null". Sehingga, jika Anda melakukan ini.
kl = c.getJSONArray("kl");
if(kl != null){
klassenID[i] = kl.getJSONObject(0).getString("id");
}
Jadi tidak heran jika Anda selalu mendapatkan error tersebut. Solusinya adalah gunakan length(), sebagai penggantinya.
kl = c.getJSONArray("kl");
if(kl != null && kl.length() > 0 ){
klassenID[i] = kl.getJSONObject(0).getString("id");
}
Beres!, sekarang kode Anda menjadi sedikit lebih baik 😃.