vacio jsonarray empty array arrays json json-rpc

arrays - empty - ¿Cómo comprobar si un JSONArray está vacío en java?



jsonarray java (2)

Estoy trabajando en una aplicación de Android que obtiene el contenido json de un servicio web llamado "WebUntis". El contenido de Json que estoy recibiendo se ve como:

{"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}]}, ...]}

Como puede ver en la matriz de resultados, también hay otras matrices como "kl", "su" y "ro".

Estoy obteniendo el contenido de estas matrices y luego las guardo en un arraylist. Pero cuando una de estas matrices está vacía, me gusta;

{"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}]}, ...]}

Siempre recibo el error IndexOutOfRangeException , pero siempre le digo que no debe tomar los arreglos vacíos, esto es lo que he intentado:

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

Alguien puede ayudarme ?


Si la matriz está definida en el archivo pero está vacía, como:

... "kl":[] ...

Luego, getJSONArray("kl") devolverá una matriz vacía , pero el objeto no es null . Entonces, si haces esto:

kl = c.getJSONArray("kl"); if(kl != null){ klassenID[i] = kl.getJSONObject(0).getString("id"); }

kl no es null y kl.getJSONObject(0) lanzará una excepción: no hay un primer elemento en la matriz.

En su lugar, puede comprobar la length() , por ejemplo:

kl = c.getJSONArray("kl"); if(kl != null && kl.length() > 0 ){ klassenID[i] = kl.getJSONObject(0).getString("id"); }


También puede usar el método isEmpty() , este es el método que usamos para verificar si la lista está vacía o no. Este método devuelve un valor booleano. Devuelve verdadero si la lista está vacía, de lo contrario da falso. Por ejemplo:

if (!k1.isEmpty()) { klassenID[i] = kl.getJSONObject(0).getString("id"); }