Iterasi JSON Array di Android / Java

148

Saya sedang membangun aplikasi android yang perlu mengunduh dan menyinkronkan dengan database online, saya mengirimkan permintaan saya dari aplikasi ke halaman php yang mengembalikan baris yang relevan dari database dalam format JSON.

bisakah seseorang tolong beri tahu saya cara terbaik untuk beralih melalui array JSON?

Saya menerima berbagai objek:

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

Apa potongan kode paling sederhana yang bisa saya gunakan untuk mengakses JSONObjects dalam array?

EDIT: sekarang saya memikirkannya metode yang saya gunakan untuk mengulangi loop itu:

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

Jadi saya kira saya bisa mengubah Json yang dikembalikan menjadi dan array yang dapat diubah. Adakah ide bagaimana saya bisa mencapai ini?

Saya minta maaf atas vaguness saya tetapi saya memiliki ini bekerja dari contoh yang saya temukan di web dan sejak itu tidak dapat menemukannya.

Kevin Bradshaw
sumber

Jawaban:

67

Saya telah melakukannya dengan dua cara berbeda,

1.) membuat Peta

        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.) membuat JSONArray nama

    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));
        }
    }
Nathan Schwermann
sumber
335

Saya pikir kode ini singkat dan jelas:

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

Itukah yang kamu cari?

vipw
sumber
3
Bagus dan sederhana! Bagus sekali!
Kervin Ramen
5
perhatikan bahwa jika Anda mengirim "larik" yang tidak memiliki angka berurutan, Anda harus menggunakan JSONObject
max4ever
ya itu sempurna tetapi sementara sejumlah besar data sangat lambat dalam pemrosesan :(
Ahmad Arslan
@ArslanAhmad Jika Anda memiliki sejumlah besar data, Anda tidak ingin membangun seluruh array objek json di memori. Alih-alih menggunakan pendekatan SAX-like. Lihat di sini: stackoverflow.com/questions/10657725/…
vipw
ini tidak bekerja untuk saya. saya mendapatkan Pengecualian JSON karena tanda kurung "{" yang mengelilingi objek?
filthy_wizard
7

Sayangnya, JSONArray tidak mendukung foreachpernyataan, seperti:

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

Mimpi
sumber
tidak, tetapi mengembalikan objek tidak JSONObject
Kesalahan
3
Kelas JSONArray tidak mengimplementasikan antarmuka Iterable
Jorgesys
4

Ketika saya mencoba saran @ vipw, saya dihadapkan dengan pengecualian ini: The method getJSONObject(int) is undefined for the type JSONArray

Ini bekerja untuk saya sebagai gantinya:

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...
}
Graham S.
sumber
Untuk android, saya mengubah myJsonArray.size () menjadi myJsonArray.length ()
Rishiraj Purohit
3

Jika Anda menggunakan implementasi Java JSON.org , yang merupakan open source, Anda bisa membuat JSONArray mengimplementasikan Iterableantarmuka dan menambahkan metode berikut ke kelas:

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

Ini akan membuat semua instance JSONArray iterable, artinya for (Object foo : bar)sintaks sekarang akan bekerja dengannya (perhatikan bahwa foo harus menjadi Object, karena JSONArrays tidak memiliki tipe yang dideklarasikan). Semua ini berfungsi karena kelas JSONArray didukung oleh ArrayList sederhana, yang sudah dapat diubah. Saya membayangkan bahwa implementasi open source lainnya akan mudah diubah.

Thunderforge
sumber
1
Yang menarik adalah bahwa pada suatu waktu implementasi JSON.org memiliki Iterator di kelas JSONArray, tetapi mereka menghapusnya: github.com/douglascrockford/JSON-java/commit/…
vipw
@ vipw Saya pernah mengirimi mereka email tentang menerapkan Iterable, tetapi mereka mengatakan bahwa pada akhirnya mereka tidak bisa karena itu akan merusak kompatibilitas dengan Java 1.4. Mungkin itu sebabnya dihapus di komit.
Thunderforge
3

Pada Array, cari:

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

Anda menggunakan objek Cast yang sama untuk setiap entri. Pada setiap iterasi, Anda hanya mengubah objek yang sama dan bukan membuat yang baru.

Kode ini harus memperbaikinya:

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;
Andriya
sumber
1

Sementara iterasi melalui array JSON (org.json.JSONArray, dibangun di Android), hati-hati terhadap objek nol ; misalnya, Anda bisa mendapatkan string "null"bukan null .

Cek mungkin terlihat seperti:

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