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 ?
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");
}
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");
}