web-dev-qa-db-fra.com

comment vérifier si un JSONArray est vide en java?

Je travaille sur une application Android qui obtient le contenu json d'un service Web appelé "WebUntis". Le contenu Json que je reçois ressemble à:

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

Comme vous pouvez le voir dans le tableau de résultats, il existe également d'autres tableaux comme "kl", "su" et "ro"

J'obtiens le contenu de ces tableaux et ensuite je les stocke dans une liste de tableaux. Mais quand l'un de ces tableaux est vide, comme;

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

Je reçois toujours l'erreur IndexOutOfRangeException, mais je lui dis toujours qu'il ne doit pas prendre les tableaux vides, c'est ce que j'ai essayé:

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

Quelqu'un peut-il m'aider ?

21
seriously

Si le tableau est défini dans le fichier mais est vide, comme:

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

Puis getJSONArray("kl") renverra un tableau vide , mais l'objet n'est pas null. Ensuite, si vous faites ceci:

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

kl is not null and kl.getJSONObject(0) lèvera une exception - il n'y a pas de premier élément dans le tableau.

Au lieu de cela, vous pouvez vérifier la length(), par exemple:

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

Vous pouvez également utiliser la méthode isEmpty(), c'est la méthode que nous utilisons pour vérifier si la liste est vide ou non. Cette méthode renvoie une valeur booléenne. Il retourne vrai si la liste est vide sinon il donne faux. Par exemple:

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