web-dev-qa-db-ja.com

Android / JavaでのJSON配列の反復

ダウンロードしてオンラインデータベースと同期する必要があるAndroidアプリを作成しています。アプリからクエリをJSONページのデータベースから関連する行を返すphpページに送信しています。

誰かがJSON配列を反復処理する最良の方法を教えてもらえますか?

オブジェクトの配列を受け取ります:

[{json object},{json object},{json object}]

配列内のJSONObjectsにアクセスするために使用できる最も単純なコードは何ですか?

編集:私はそれを考えると、ループを反復するために使用した方法は次のとおりでした:

for (String row: json){
     id = row.getInt("id");
     name = row.getString("name");
     password = row.getString("password");
}

だから、返されたJsonをなんとかして反復可能な配列に変えることができたと思います。どのようにこれを達成することができますか?

私は自分の曖昧さをおaびしますが、ウェブで見つけた例からこれが機能していて、それを見つけることができませんでした。

143
Kevin Bradshaw

私はそれを2つの異なる方法で行いました、

1。)マップを作成する

        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。)名前のJSONArrayを作成

    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
schwiz

このコードは短く明確だと思います:

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

それはあなたが探していたものですか?

326
vipw

残念ながら、JSONArraydoes n'tは、次のようなforeachステートメントをサポートします。

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

JSON.org Java implementation (オープンソース)を使用している場合、JSONArrayにIterableインターフェイスを実装させ、次のメソッドをクラスに追加するだけです。

@Override
public Iterator iterator() {
    return this.myArrayList.iterator();
}

これにより、JSONArrayのすべてのインスタンスが反復可能になり、for (Object foo : bar)構文が動作するようになります(JSONArrayには宣言された型がないため、fooはオブジェクトでなければならないことに注意してください)。 JSONArrayクラスは単純なArrayListによってサポートされているため、これはすべて機能します。これは既に反復可能です。他のオープンソースの実装も同様に簡単に変更できると思います。

3
Thunderforge

配列で、次を探します。

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

@vipwの提案を試みたとき、この例外に直面しました:The method getJSONObject(int) is undefined for the type JSONArray

これは代わりに私のために働いた:

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.

すべてのエントリに同じCastオブジェクトを使用しています。各反復で、新しいオブジェクトを作成する代わりに同じオブジェクトを変更しただけです。

このコードはそれを修正する必要があります:

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

JSON配列(Androidに組み込まれているorg.json.JSONArray)を繰り返し処理する際には、nullオブジェクトに注意してください。たとえば、null文字列の代わりに"null"を取得できます。

チェックは次のようになります。

s[i] = array.isNull(i) ? null : array.getString(i);