Android / Java中的JSON数组迭代
我正在构build一个需要下载并与在线数据库同步的android应用程序,我正在从应用程序发送我的查询到一个php页面,从JSON格式的数据库返回相关的行。
有人可以告诉我迭代通过JSON数组的最佳方式?
我收到一个对象数组:
[{json object},{json object},{json object}]
我可以用来访问数组中的JSONObjects的最简单的代码是什么?
编辑:现在我想到了我用来迭代循环的方法是:
for (String row: json){ id = row.getInt("id"); name = row.getString("name"); password = row.getString("password"); }
所以我想我已经能够把返回的Json转换成可迭代的数组。 任何想法我怎么能做到这一点?
我为自己的迷茫道歉,但是我从网上find的一个例子中find了这个工作,之后一直无法find它。
我做了两种不同的方式,
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"); }
那是你在找什么?
这篇文章帮助我开始使用JSON和Android:
http://www.androidcompetencycenter.com/2009/10/json-parsing-in-android/
在数组上,寻找:
JSONArray menuitemArray = popupObject.getJSONArray("menuitem");
不幸的是,JSONArray不支持每个语句,如:
for(JSONObject someObj : someJsonArray) { // do something about someObj .... .... }
使用jacksonJava JSON处理器 ,它也可用于Android。
有几种方法可以parsingJSON:
- stream媒体(如萨克斯)
- 树(如DOM)
- 对象映射(如JAXB)
编辑:
拿org.json类, 已经在 android API中。
如果您使用的是开源的JSON.org Java实现 ,那么可以让JSONArray实现Iterable
接口,并将以下方法添加到该类中:
@Override public Iterator iterator() { return this.myArrayList.iterator(); }
这将使JSONArray的所有实例都可迭代,这意味着for (Object foo : bar)
语法现在可以与它一起工作(请注意,foo必须是Object,因为JSONArrays没有声明types)。 所有这些工作,因为JSONArray类是由一个简单的ArrayList,这已经是可迭代的支持。 我想其他的开源实现将会很容易改变。
每个条目都使用相同的Cast对象。 在每次迭代中,您只需更改同一个对象,而不是创build一个新对象。
这段代码应该修复它:
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;
在迭代JSON数组(org.json.JSONArray,内置于Android)时,请注意空对象; 例如,您可能会得到"null"
而不是空string。
支票可能如下所示:
s[i] = array.isNull(i) ? null : array.getString(i);
当我尝试@ vipw的build议时,我遇到了这个exception: 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... }
希望这将有助于需要迭代使用JSONObject的人
for(Object object: jsonArray){ JSONObject jsonObject = (JSONObject) object; // Then you can go on from here }