Итерация массива JSON в Android / Java



Я создаю приложение для android, которое необходимо загрузить и синхронизировать с онлайн-базой данных, я отправляю свой запрос из приложения на страницу php, которая возвращает соответствующие строки из базы данных в формате JSON.



может кто-нибудь, пожалуйста, скажите мне лучший способ итерации через массив JSON?



Я получаю массив объектов:



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



какой самый простой фрагмент кода я мог бы использовать для доступа к JSONObjects в массив?



EDIT: теперь, когда я думаю об этом, метод, который я использовал для итерации цикла, был:



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


поэтому я предполагаю, что мне каким-то образом удалось превратить возвращенный Json в итерируемый массив. Любые идеи, как я мог бы достичь этого?



Я извиняюсь за свою бродяжничество, но у меня была эта работа из примера, который я нашел в интернете, и с тех пор не смог его найти.

496   8  

8 ответов:

Я сделал это двумя различными способами:

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 не поддерживает каждый оператор, например:

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

Если вы используете JSON.org реализация Java, который является открытым исходным кодом, вы можете просто сделать JSONArray реализации Iterable интерфейс и добавьте следующий метод в класс:

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

Это позволит сделать всех экземпляров итерируемый JSONArray, т. е. for (Object foo : bar) синтаксис теперь будет работать с ним (обратите внимание, что Foo должен быть объект, потому что массивы jsonarray не объявленного типа). Все это работает, потому что класс JSONArray поддерживается простым ArrayList, что уже можно повторить. Я полагаю, что другие реализации с открытым исходным кодом было бы так же легко изменить.

на массивы, искать:

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

вы используете один и тот же объект приведения для каждой записи. На каждой итерации вы просто меняли один и тот же объект, а не создавали новый.

этот код должен исправить это:

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;

когда я попробовал предложение @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.формат JSON.JSONArray, встроенный в Android), следите за null объекты; например, вы можете сделать "null" вместо null строку.

проверка может выглядеть так:

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

Comments

    Ничего не найдено.