Android / Java'da JSON Dizisi yinelemesi


148

İndirmek ve çevrimiçi bir veritabanı ile senkronize edilmesi gereken bir android uygulaması inşa ediyorum, sorgumu uygulamadan JSON formatında bir veritabanından ilgili satırları döndüren bir php sayfasına gönderiyorum.

Birisi bana bir JSON dizisi üzerinden yinelemek için en iyi yolu söyleyebilir?

Bir dizi nesne alıyorum:

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

Dizideki JSONObjects'e erişmek için kullanabileceğim en basit kod parçası nedir?

EDIT: şimdi ben döngü yineleme için kullanılan yöntem olduğunu düşünüyorum:

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

Yani sanırım ben bir şekilde geri dönen Json ve yinelenebilir dizi açmak mümkün oldu. Bunu nasıl başarabileceğim hakkında bir fikrin var mı?

Vagunluğum için özür dilerim ama bunu web'de bulduğum bir örnekten aldım ve o zamandan beri bulamadım.


1
aşağıdaki bağlantıyı kontrol edin: androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial
Aakash

Yanıtlar:


67

Bunu iki farklı şekilde yaptım,

1.) Harita Yap

        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 isimleri yapmak

    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

Bu kod kısa ve net olduğunu düşünüyorum:

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

Aradığın şey bu mu?


3
Güzel ve basit! Harika çalışıyor!
Kervin Ramen

5
art arda numara içermeyen bir "dizi" gönderirseniz, JSONObject
max4ever

evet mükemmel ama büyük miktarda veri işlerken çok yavaş olmasına rağmen :(
Ahmad Arslan

@ArslanAhmad Büyük miktarda veriniz varsa, json nesne dizisinin tamamını bellekte oluşturmak istemezsiniz. Bunun yerine SAX benzeri bir yaklaşım kullanın. Buraya bakın: stackoverflow.com/questions/10657725/…
vipw

bu benim için çalışmıyor. nesne çevreleyen "{" köşeli ayraç nedeniyle bir JSON özel durumu olsun?
filthy_wizard

7

Ne yazık ki, JSONArray değil desteklemek foreachgibi ifadeleri,:

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


yapar, ancak nesne JSONObject değil döndürür
Hata

3
JSONArray sınıfı Yinelenebilir arabirimi uygulamaz
Jorgesys

4

@ Vipw'nin önerisini denediğimde, bu istisna ile karşı karşıya kaldım: The method getJSONObject(int) is undefined for the type JSONArray

Bu benim için çalıştı:

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 için bunun yerine myJsonArray.size () öğesini myJsonArray.length () olarak değiştirdim
Rishiraj Purohit

3

Açık kaynak kodlu JSON.org Java uygulamasını kullanıyorsanız, JSONArray'ınIterable arabirimi uygulamasını sağlayabilir ve sınıfa aşağıdaki yöntemi ekleyebilirsiniz:

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

Bu, tüm JSONArray örneklerini yinelenebilir hale getirir, yani for (Object foo : bar)sözdiziminin artık onunla çalışacağı anlamına gelir (JSONArrays'ın bildirilen bir türü olmadığı için foo'nun bir Nesne olması gerektiğini unutmayın). Tüm bunlar, JSONArray sınıfı zaten yinelenebilir olan basit bir ArrayList tarafından desteklendiği için çalışır. Diğer açık kaynak uygulamalarının da değiştirilmesi kadar kolay olacağını düşünüyorum.


1
İlginç olan, bir zamanlar JSON.org uygulamasının JSONArray sınıfında bir Yineleyici olması, ancak kaldırmasıdır: github.com/douglascrockford/JSON-java/commit/…
vipw

@vipw Yinelenebilir uygulama hakkında onlara bir kez e-posta gönderdim, ama sonuçta Java 1.4 ile uyumluluğu bozacağı için yapamayacaklarını söylediler. Belki de işte bu yüzden kaldırıldı.
Thunderforge

3

Dizilerde şunlara bakın:

JSONArray menuitemArray = popupObject.getJSONArray("menuitem"); 

2

Her giriş için aynı Cast nesnesini kullanıyorsunuz. Her yinelemede yeni bir nesne oluşturmak yerine aynı nesneyi değiştirdiniz.

Bu kod düzeltmelidir:

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

Bir JSON dizisi (Android'de yerleşik olarak bulunan org.json.JSONArray) üzerinden yineleme yaparken null nesnelere dikkat edin ; örneğin, null"null" yerine dize .

Bir çek şöyle görünebilir:

s[i] = array.isNull(i) ? null : array.getString(i);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.