Android / Java에서 JSON 배열 반복 해야하는 Android

온라인 데이터베이스를 다운로드하고 동기화 해야하는 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을 반복 가능한 배열로 바꿀 수 있었다고 생각합니다. 어떻게 이것을 달성 할 수 있습니까?

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



답변

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

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

답변

이 코드는 짧고 명확하다고 생각합니다.

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

그게 당신이 찾고 있었던 것입니까?


답변

불행히도 다음과 같은 진술을 지원 JSONArray 하지 않습니다foreach .

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

답변

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

답변

오픈 소스 인 JSON.org Java 구현을 사용하는 경우 JSONArray가 Iterable인터페이스를 구현 하도록하고 클래스에 다음 메소드를 추가하면됩니다.

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

이렇게하면 JSONArray의 모든 인스턴스를 반복 가능하게 만들 수 있습니다. 즉, for (Object foo : bar)구문이 작동합니다 (JSONArray에는 선언 된 유형이 없으므로 foo는 Object 여야 함). JSONArray 클래스는 이미 반복 가능한 간단한 ArrayList에 의해 지원되기 때문에이 모든 것이 작동합니다. 다른 오픈 소스 구현도 변경하기 쉽다고 생각합니다.


답변

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

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

답변

모든 항목에 대해 동일한 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;