2010-08-04 20 views
128

Buduję aplikację na Androida, która musi pobrać i zsynchronizować się z bazą danych online, wysyłam zapytanie z aplikacji na stronę php, która zwraca odpowiednie wiersze z bazy danych w formacie JSON .JSON Array iteracja w systemie Android/Java

Czy ktoś może mi powiedzieć najlepszy sposób na iterację w tablicy JSON?

mogę otrzymać tablicę obiektów:

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

Jaki jest najprostszy kawałek kodu mogę użyć aby uzyskać dostęp do JSONObjects w tablicy?

EDIT: teraz, kiedy o tym myślę metoda użyłem do iteracji pętli było:

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

Więc myślę, że miałam jakoś w stanie włączyć zwrócony do JSON i iterable tablicą. Jakieś pomysły, w jaki sposób mogę to osiągnąć?

Przepraszam za moją vaguness, ale pracowałem nad przykładem, który znalazłem w Internecie i od tego czasu nie mogłem go znaleźć.

+1

wyboru następujący link: https://androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial/ – Aakash

Odpowiedz

62

Zrobiłem to dwa różne sposoby,

1.) zrobić mapę

 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 .) utworzyć JSONArray o nazwach

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

na tablicach, poszukaj:

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

myślę, że ten kod jest krótka i jasna:

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

Czy tego szukałeś?

+3

Ładne i proste! Działa świetnie! –

+5

Zauważ, że jeśli wysyłasz "tablicę", która nie ma kolejnych numerów, musisz użyć JSONObject – max4ever

+0

tak, ale jest to doskonałe, ale podczas gdy duża ilość danych jest bardzo wolna w przetwarzaniu :( –

3

Jeśli używasz JSON.org Java implementation, który jest open source, można po prostu zrobić JSONArray implementować interfejs Iterable i dodaj następującą metodę do klasy:

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

uczyni wszystkie instancje JSONArray iterowalny , co oznacza, że ​​składnia for (Object foo : bar) będzie z nim działać (zauważ, że foo musi być obiektem, ponieważ JSONArrays nie ma zadeklarowanego typu). Wszystko to działa, ponieważ klasa JSONArray jest wspierana przez prostą ArrayList, która jest już możliwa do sprawdzenia. Wyobrażam sobie, że inne implementacje open source byłyby równie łatwe do zmiany.

+1

Co ciekawe, w pewnym momencie implementacja JSON.org miała Iterator w klasa JSONArray, ale ją usunęli: https://github.com/douglascrockford/JSON-java/commit/ae8d12c5f4c139d310bf6fee39c35b215d2fec15 – vipw

+0

@vipw Wysłałem ich e-mailem raz o implementacji Iterable, ale powiedzieli że ostatecznie nie mogą, ponieważ złamie kompatybilność z Javą 1.4. Być może właśnie dlatego został usunięty w zatwierdzeniu. – Thunderforge

1

Podczas iteracji na macierzy JSON (org.json.JSONArray, wbudowanej w system Android), należy uważać na obiekty o wartości o wartości null:; na przykład możesz uzyskać "null" zamiast ciągu null.

Czek może wyglądać następująco:

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

niestety JSONArray nie obsługuje dla każdej instrukcji, jak:

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

+0

ma, ale zwraca obiekt nie JSONObject – Error

+1

Klasa JSONArray nie implementuje interfejsu Iterable – Jorgesys

2

używasz tego samego obiektu Obsada za każdy wpis. W każdej iteracji właśnie zmieniłeś ten sam obiekt, zamiast tworzyć nowy.

Ten kod powinien to naprawić:

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

Kiedy próbowałem sugestię @ vipw jest, miałem do czynienia z tego wyjątku: The method getJSONObject(int) is undefined for the type JSONArray

ten pracował dla mnie zamiast:

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