Android / Java中的JSON数组迭代

时间:2010-08-04 19:13:49

标签: java android arrays json

我正在构建一个需要下载并与在线数据库同步的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转换为可迭代的数组。任何想法我怎么能做到这一点?

我为我的迷途道歉,但我从网上发现的一个例子中得到了这个,但后来一直无法找到它。

8 个答案:

答案 0 :(得分:326)

我认为这段代码简短明了:

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");
}

那是你在找什么?

答案 1 :(得分:66)

我做了两种不同的方式,

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 :(得分:5)

不幸的是,JSONArray 不支持支持foreach语句,例如:

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

答案 3 :(得分:3)

在阵列上,寻找:

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

答案 4 :(得分:3)

如果你正在使用开源的JSON.org Java implementation,你可以让JSONArray实现Iterable接口并将以下方法添加到类中:

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

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

答案 5 :(得分:3)

当我尝试@ 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...
}

答案 6 :(得分:2)

您为每个条目使用相同的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 :(得分:1)

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

支票可能如下:

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