Android/Java中的JSON数组迭代

68de4m5k  于 2023-06-04  发布在  Android
关注(0)|答案(9)|浏览(335)

我正在构建一个需要下载并与在线数据库同步的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转换为可迭代数组。任何想法我如何才能实现这一点?
我为我的流浪感到抱歉,但我从网上找到的一个例子中找到了这个工作,此后一直无法找到它。

knpiaxh1

knpiaxh11#

我认为这段代码简短而清晰:

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

你在找这个吗

ljo96ir5

ljo96ir52#

我用了两种不同的方法

1.)制作Map

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

guz6ccqo3#

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

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

kninwzqo4#

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

xvw2m8pv5#

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

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

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

rbl8hiat

rbl8hiat6#

在阵列上,查找:

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

vjhs03f77#

您正在为每个条目使用相同的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;
ulydmbyx

ulydmbyx8#

在遍历JSON数组(org.json.JSONArray,内置于Android)时,要注意null对象;例如,您可能会得到"null"而不是null字符串。
检查可能看起来像:

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

wdebmtf29#

或者,特别是在没有iterator()的Android上,你可以定义自己的迭代器:

import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;

public final
class JSONArrayIterator<E> implements Iterator<E> {
    private JSONArray jsonArray;
    private int l;
    private int i;

    JSONArrayIterator(JSONArray jsonArray) {
        this.jsonArray = jsonArray;
        this.l = jsonArray.length();
        this.i = 0;
    }
    @SuppressWarnings("unchecked")
    public E next() {
        try {
            Object o = this.jsonArray.get(this.i++);
            return (E)o;
        } catch (JSONException ex) {
        }
        return null;
    }

}

当你假设你的数组的元素类型都是相同的时候,它就起作用了。在许多情况下,这可能不是一个好的实践,因此您可能希望添加更多的类型检查。
然后你可以用途:

for (JSONObject row: new JSONArrayIterator<JSONObject>(jsonArray)){
     id = row.getInt("id");
     name = row.getString("name");
     password = row.getString("password");
}

相关问题