Je construis une application Android qui doit être téléchargée et synchronisée avec une base de données en ligne. J'envoie ma requête depuis l'application à une page php qui renvoie les lignes pertinentes d'une base de données au format JSON.
quelqu'un peut-il me dire s'il vous plaît le meilleur moyen de parcourir un tableau JSON?
Je reçois un tableau d'objets:
[{json object},{json object},{json object}]
Quel est le morceau de code le plus simple que j'ai pu utiliser pour accéder aux JSONObjects du tableau?
EDIT: maintenant que j'y pense, la méthode que j'ai utilisée pour itérer la boucle était la suivante:
for (String row: json){
id = row.getInt("id");
name = row.getString("name");
password = row.getString("password");
}
Donc, je suppose que j’ai été capable de transformer le Json retourné en un tableau itérable. Des idées comment je pourrais réaliser ceci?
Je m'excuse pour mon vaguness mais j'ai eu ce travail à partir d'un exemple que j'ai trouvé sur le web et que je n'ai pas pu trouver depuis.
Je l'ai fait de deux manières différentes,
1. Faire une carte
HashMap<String, String> applicationSettings = new HashMap<String,String>();
for(int i=0; i<settings.length(); i++){
String value = settings.getJSONObject(i).getString("value");
String name = settings.getJSONObject(i).getString("name");
applicationSettings.put(name, value);
}
2.) Faire un JSONArray de noms
JSONArray names = json.names();
JSONArray values = json.toJSONArray(names);
for(int i=0; i<values.length(); i++){
if (names.getString(i).equals("description")){
setDescription(values.getString(i));
}
else if (names.getString(i).equals("expiryDate")){
String dateString = values.getString(i);
setExpiryDate(stringToDateHelper(dateString));
}
else if (names.getString(i).equals("id")){
setId(values.getLong(i));
}
else if (names.getString(i).equals("offerCode")){
setOfferCode(values.getString(i));
}
else if (names.getString(i).equals("startDate")){
String dateString = values.getString(i);
setStartDate(stringToDateHelper(dateString));
}
else if (names.getString(i).equals("title")){
setTitle(values.getString(i));
}
}
Je pense que ce code est court et clair:
int id;
String name;
JSONArray array = new JSONArray(string_of_json_array);
for (int i = 0; i < array.length(); i++) {
JSONObject row = array.getJSONObject(i);
id = row.getInt("id");
name = row.getString("name");
}
Est-ce ce que vous cherchiez?
Malheureusement, JSONArray
non prend en charge les instructions foreach
, telles que:
for(JSONObject someObj : someJsonArray) {
// do something about someObj
....
....
}
Si vous utilisez l’implémentation JSON.org Java , qui est open source, vous pouvez simplement faire en sorte que JSONArray mette en œuvre l’interface Iterable
et ajoute la méthode suivante à la classe:
@Override
public Iterator iterator() {
return this.myArrayList.iterator();
}
Cela rend toutes les occurrences de JSONArray itéables, ce qui signifie que la syntaxe for (Object foo : bar)
fonctionnera à présent (notez que foo doit être un objet, car JSONArrays n'a pas de type déclaré). Tout cela fonctionne car la classe JSONArray est supportée par un simple ArrayList, qui est déjà itérable. J'imagine que d'autres implémentations open source seraient tout aussi faciles à changer.
Sur les tableaux, recherchez:
JSONArray menuitemArray = popupObject.getJSONArray("menuitem");
Lorsque j'ai essayé la suggestion de @vipw, j'ai été confronté à cette exception: The method getJSONObject(int) is undefined for the type JSONArray
Cela a fonctionné pour moi à la place:
int myJsonArraySize = myJsonArray.size();
for (int i = 0; i < myJsonArraySize; i++) {
JSONObject myJsonObject = (JSONObject) myJsonArray.get(i);
// Do whatever you have to do to myJsonObject...
}
Vous utilisez le même objet Cast pour chaque entrée. A chaque itération, vous venez de changer le même objet à la place d'un nouvel objet.
Ce code devrait résoudre ce problème:
JSONArray jCastArr = jObj.getJSONArray("abridged_cast");
ArrayList<Cast> castList= new ArrayList<Cast>();
for (int i=0; i < jCastArr.length(); i++) {
Cast person = new Cast(); // create a new object here
JSONObject jpersonObj = jCastArr.getJSONObject(i);
person.castId = (String) jpersonObj.getString("id");
person.castFullName = (String) jpersonObj.getString("name");
castList.add(person);
}
details.castList = castList;
En effectuant une itération sur un tableau JSON (org.json.JSONArray, intégré à Android), faites attention aux objets null; Par exemple, vous pouvez obtenir "null"
au lieu d'une chaîne null.
Un chèque peut ressembler à:
s[i] = array.isNull(i) ? null : array.getString(i);