Android/Java 中的 JSON 数组迭代

我正在建立一个安卓应用程序,需要下载和同步与在线数据库,我发送我的查询从应用程序到一个 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 转换成可迭代的数组。你知道我是怎么做到的吗?

我为我的模糊道歉,但我从一个例子,我在网上找到了这个工作,一直无法找到它。

224569 次浏览

在 Ararray 中,查找:

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

我用了两种不同的方法,

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.org Java 实现,那么您可以让 JSONArray 实现 Iterable接口并向类中添加以下方法:

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

这将使得 JSONArray 的所有实例都是可迭代的,这意味着 for (Object foo : bar)语法现在将与它一起工作(注意 foo 必须是一个 Object,因为 JSONArray 没有声明的类型)。所有这些都可以工作,因为 JSONArray 类由一个简单的 ArrayList 支持,这个 ArrayList 已经是可迭代的。我想其他的开源实现也同样容易改变。

在迭代 JSON 数组(org.JSON.JSONArray,内置于 Android 中)时,要注意 无效对象; 例如,您可能会得到 "null"而不是 无效字符串。

一张支票看起来可能是这样的:

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

不幸的是,JSONArray 没有支持 foreach语句,比如:

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

每个条目都使用相同的 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;

当我尝试@vipw 的建议时,我面临着这样一个例外: 对于 JSONArray 类型,getJSONObject (int)方法是未定义的

相反,这对我很有效:

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