Itération de JSON Array dans Android / Java
je construis une application android qui a besoin de télécharger et de synchroniser avec une base de données en ligne, j'envoie ma requête à partir de l'application à une page php qui renvoie les lignes pertinentes à partir d'une base de données au format JSON.
quelqu'un peut-il s'il vous plaît me dire la meilleure façon d'itérer à travers un tableau JSON?
je reçois un tableau d'objets:
[{json object},{json object},{json object}]
Quel est le plus simple morceau de code que je pourrais utiliser pour accéder aux JSONObjects dans le tableau?
EDIT: maintenant que j'y pense la méthode que j'ai utilisée pour itérer la boucle était:
for (String row: json){
id = row.getInt("id");
name = row.getString("name");
password = row.getString("password");
}
donc je suppose que j'ai réussi à transformer le JSON retourné en un tableau itérable. Aucune Idées de comment je pourrais faire?
Je m'excuse pour mon vagabondage mais j'ai eu ce travail à partir d'un exemple que j'ai trouvé sur le web et j'ai été incapable de le trouver depuis.
8 réponses
Je l'ai fait de deux façons 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");
}
c'est ce que vous cherchiez?
malheureusement, JSONArray ne supporte pas chaque déclaration, comme:
for(JSONObject someObj : someJsonArray) {
// do something about someObj
....
....
}
si vous utilisez le JSON.org Java implementation , qui est open source, vous pouvez juste faire JSONArray mettre en œuvre l'interface Iterable
et ajouter la méthode suivante à la classe:
@Override
public Iterator iterator() {
return this.myArrayList.iterator();
}
cela rendra toutes les instances de JSONArray itérables, ce qui signifie que la syntaxe for (Object foo : bar)
fonctionnera maintenant avec elle (notez que foo doit être un objet, parce que JSONArrays n'a pas de type déclaré). Tout cela fonctionne parce que le JSONArray class est soutenu par un ArrayList simple, qui est déjà itérable. J'imagine que d'autres implémentations open source serait tout aussi facile de changer.
sur les tableaux, rechercher:
JSONArray menuitemArray = popupObject.getJSONArray("menuitem");
vous utilisez le même objet moulé pour chaque entrée. Sur chaque itération vous avez juste changé le même objet au lieu d'en créer un nouveau.
ce code devrait le corriger:
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;
quand 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...
}
en itérant sur un tableau JSON (org.json.JSONArray, intégré à Android), attention aux objets null ; par exemple, vous pouvez obtenir "null"
au lieu d'une chaîne de caractères null .
un contrôle peut ressembler à:
s[i] = array.isNull(i) ? null : array.getString(i);