Android / JavaでのJSON配列の反復


148

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

誰かが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を反復可能な配列になんとかして変換できたと思います。これをどのように達成できるかについてのアイデアはありますか?

ご迷惑をおかけして申し訳ありませんが、ウェブで見つけた例からこれを機能させて以来、それを見つけることができませんでした。


1
次のリンクを確認してください:androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial
Aakash

回答:


67

私はそれを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));
        }
    }

335

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

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

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


3
素敵でシンプル!よく働く!
Kervin Ramen、2011

5
連続番号のない「配列」を送信する場合は、JSONObjectを使用する必要があることに注意してください
max4ever

ええそれは完璧ですが、大量のデータの処理は非常に遅いです:(
Ahmad Arslan

@ArslanAhmad大量のデータがある場合、jsonオブジェクト配列全体をメモリ内に構築する必要はありません。代わりに、SAXに似たアプローチを使用してください。ここを参照してください:stackoverflow.com/questions/10657725/...
vipwを

これは私にはうまくいきません。オブジェクトを囲む「{」ブラケットが原因でJSON例外が発生しますか?
filthy_wizard

7

残念ながら、次のようなステートメントJSONArray サポートされていませんforeach

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


ありますが、JSONObjectではなくオブジェクトを返します
エラー

3
JSONArrayクラスはIterableインターフェースを実装していません
Jorgesys

4

@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...
}

Androidの場合、代わりにmyJsonArray.size()をmyJsonArray.length()に変更しました
Rishiraj Purohit

3

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

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

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


1
:どのような興味深いのは、一度にJSON.org実装はJSONArrayクラスでIteratorを持っていたが、彼らはそれを取り除くことであるgithub.com/douglascrockford/JSON-java/commit/...
はvipwを

@vipw Iterableの実装について一度メールを送っていましたが、Java 1.4との互換性が失われるため、最終的には送信できなかったと彼らは言いました。おそらくそれがコミットで削除された理由です。
Thunderforge 2014


2

すべてのエントリに同じ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;

1

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

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

s[i] = array.isNull(i) ? null : array.getString(i);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.