web-dev-qa-db-fra.com

Itération de tableaux JSON sous Android / Java

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.

145
Kevin Bradshaw

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));
        }
    }
67
schwiz

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?

328
vipw

Malheureusement, JSONArraynon prend en charge les instructions foreach, telles que:

for(JSONObject someObj : someJsonArray) {
    // do something about someObj
    ....
    ....
}
6
Dream

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.

3
Thunderforge

Sur les tableaux, recherchez:

JSONArray menuitemArray = popupObject.getJSONArray("menuitem"); 
3
Paul Burke

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...
}
3
Graham S.

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;
2
Andriya

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);
1