JSON Array итерация в 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 в итеративный массив. Любые идеи, как я мог бы это достичь?
Я извиняюсь за свою бродяжничество, но у меня это работало из примера, который я нашел в Интернете, и с тех пор не смог его найти.
Ответы
Ответ 1
Я сделал это двумя разными способами:
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));
}
}
Ответ 2
Я думаю, что этот код короткий и понятный:
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
В разделе "Массивы" найдите:
JSONArray menuitemArray = popupObject.getJSONArray("menuitem");
Ответ 4
Если вы используете JSON.org Java-реализацию, которая является открытым исходным кодом, вы можете просто сделать JSONArray реализовать интерфейс Iterable
и добавьте следующий класс в класс:
@Override
public Iterator iterator() {
return this.myArrayList.iterator();
}
Это сделает все экземпляры JSONArray итерабельными, что означает, что синтаксис for (Object foo : bar)
теперь будет работать с ним (обратите внимание, что foo должен быть объектом, потому что JSONArrays не имеет объявленного типа). Все это работает, потому что класс JSONArray поддерживается простым ArrayList, который уже является итерируемым. Я предполагаю, что другие реализации с открытым исходным кодом так же легко изменить.
Ответ 5
К сожалению, JSONArray не поддерживает для каждого оператора, например:
for(JSONObject someObj : someJsonArray) {
// do something about someObj
....
....
}
Ответ 6
Вы используете один и тот же объект 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;
Ответ 7
Итерируя по массиву JSON (org.json.JSONArray, встроенный в Android), следите за объектами null; например, вы можете получить "null"
вместо строки null.
Проверка может выглядеть так:
s[i] = array.isNull(i) ? null : array.getString(i);
Ответ 8
Когда я попробовал предложение @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...
}
Ответ 9
Надеюсь, что это поможет кому-то, кому нужно перебирать JSONObject, используя для каждого
for(Object object: jsonArray){
JSONObject jsonObject = (JSONObject) object;
// Then you can go on from here
}