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.

138
demandé sur Svetoslav Marinov 2010-08-04 23:13:48

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));
        }
    }
66
répondu schwiz 2016-07-29 21:46:55

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?

316
répondu vipw 2013-06-05 10:29:01

malheureusement, JSONArray ne supporte pas chaque déclaration, comme:

for(JSONObject someObj : someJsonArray) {
    // do something about someObj
    ....
    ....
}
4
répondu Dream 2015-01-21 08:14:09

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.

3
répondu Thunderforge 2013-03-14 02:22:58

sur les tableaux, rechercher:

JSONArray menuitemArray = popupObject.getJSONArray("menuitem"); 
3
répondu Paul Burke 2017-12-14 08:22:58

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;
2
répondu Andriya 2015-07-08 11:29:17

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...
}
2
répondu Graham S. 2016-05-30 03:01:39

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);
1
répondu 18446744073709551615 2013-03-05 08:02:32