Android / Java에서 JSON 배열 반복


148

온라인 데이터베이스를 다운로드하고 동기화 해야하는 Android 앱을 작성 중입니다. 앱에서 PHP 형식으로 쿼리를 보내 데이터베이스의 관련 행을 JSON 형식으로 반환합니다.

누군가 JSON 배열을 반복하는 가장 좋은 방법을 알려주십시오.

객체 배열을받습니다.

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

배열에서 JSONObject에 액세스하는 데 사용할 수있는 가장 간단한 코드는 무엇입니까?

편집 : 이제 루프를 반복하는 데 사용한 방법은 다음과 같습니다.

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

그래서 어떻게 든 반환 된 Json을 반복 가능한 배열로 바꿀 수 있었다고 생각합니다. 어떻게 이것을 달성 할 수 있습니까?

나는 모호한 점에 대해 사과하지만 웹에서 찾은 예에서이 작업을 수행 한 후 찾을 수 없었습니다.


답변:


67

나는 두 가지 다른 방식으로 해왔어요

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
좋고 간단합니다! 잘 작동합니다!
커빈라면

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

안드로이드의 경우, 대신 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)구문이 작동합니다 (JSONArray에는 선언 된 유형이 없으므로 foo는 Object 여야 함). JSONArray 클래스는 이미 반복 가능한 간단한 ArrayList에 의해 지원되기 때문에이 모든 것이 작동합니다. 다른 오픈 소스 구현도 변경하기 쉽다고 생각합니다.


1
흥미로운 점은 JSON.org 구현에 JSONArray 클래스에 반복자가 있었지만 github.com/douglascrockford/JSON-java/commit/…
vipw

@vipw Iterable 구현에 대해 한 번 이메일을 보냈지 만 궁극적으로 Java 1.4와의 호환성을 잃을 수는 없다고 말했습니다. 아마도 이것이 커밋에서 제거 된 이유 일 것입니다.
Thunderforge

3

배열에서 다음을 찾으십시오.

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

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 배열 (Android에 내장 된 org.json.JSONArray)을 반복하는 동안 null 객체를주의하십시오. 예를 들어 null 문자열 "null"대신 얻을 수 있습니다 .

수표는 다음과 같습니다.

s[i] = array.isNull(i) ? null : array.getString(i);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.