Android / Java中的JSON数组迭代


148

我正在构建一个需要下载并与在线数据库同步的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变成可迭代的数组。有什么想法可以实现吗?

我为自己的冒昧表示歉意,但我通过网上发现的一个示例进行了此操作,此后一直无法找到它。


Answers:


67

我已经用两种不同的方式做到了

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

335

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

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
漂亮又简单!很棒!
凯文·拉面

5
请注意,如果您发送的“数组”没有连续的数字,则必须使用JSONObject
max4ever 2012年

是的,它是完美的,但是尽管有大量数据,但处理速度很慢:(
Ahmad Arslan 2014年

@ArslanAhmad如果您有大量数据,则不想在内存中构造整个json对象数组。而是使用类似SAX的方法。看到这里:stackoverflow.com/questions/10657725/…–
vipw

这对我不起作用。我由于对象周围的“ {”括号而收到JSON异常?
filthy_wizard 2015年

7

不幸的是,JSONArray 支持以下foreach语句:

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


可以,但是它返回的对象不是JSONObject
错误

3
JSONArray类未实现Iterable接口
Jorgesys

4

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

对于Android,我将myJsonArray.size()更改为myJsonArray.length()
Rishiraj Purohit19年

3

如果使用的是开放源代码的JSON.org Java实现,则只需使JSONArray实现该Iterable接口并将以下方法添加到该类即可:

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

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


1
有趣的是,一次JSON.org实现在JSONArray类中有一个Iterator,但他们将其删除:github.com/douglascrockford/JSON-java/commit/…–
vipw

@vipw我曾经给他们发送过有关实现Iterable的电子邮件,但是他们说最终他们不能,因为这将破坏与Java 1.4的兼容性。也许这就是为什么在提交中将其删除。
Thunderforge 2014年

3

在数组上,查找:

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

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;

1

在遍历JSON数组(Android内置的org.json.JSONArray)时,请注意是否存在对象;例如,您可以获取"null"而不是字符串。

支票可能看起来像:

s[i] = array.isNull(i) ? null : array.getString(i);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.