Итерация массива 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 в итерируемый массив. Любые идеи, как я мог бы достичь этого?
Я извиняюсь за свою бродяжничество, но у меня была эта работа из примера, который я нашел в интернете, и с тех пор не смог его найти.
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 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