Java 使用for-each循环或使用迭代器迭代JSON数组(Android Studio)

Java 使用for-each循环或使用迭代器迭代JSON数组(Android Studio),java,android,arrays,json,Java,Android,Arrays,Json,我目前正在尝试使用for-each循环或迭代器(而不是普通的for循环)来迭代JSONArray,但看起来org.json不支持它们。任何关于如何编辑以下代码以使其工作的想法,我已经尝试了4个小时来寻找解决方案,但遗憾的是没有任何成功。任何帮助都将不胜感激。以下是代码的重要部分: String strJson = loadJsonFromAssetsFolder(); JSONObject jsonRootObject = new JSONObject(strJson); JSONArray j

我目前正在尝试使用for-each循环或迭代器(而不是普通的for循环)来迭代JSONArray,但看起来org.json不支持它们。任何关于如何编辑以下代码以使其工作的想法,我已经尝试了4个小时来寻找解决方案,但遗憾的是没有任何成功。任何帮助都将不胜感激。以下是代码的重要部分:

String strJson = loadJsonFromAssetsFolder();
JSONObject jsonRootObject = new JSONObject(strJson);
JSONArray jsonArray = jsonRootObject.optJSONArray("restaurant");
  for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            list.add(jsonObject.optString("name").toString());
  }
String strJson=loadJsonFromAssetFolder();
JSONObject jsonRootObject=新的JSONObject(strJson);
JSONArray JSONArray=jsonRootObject.optJSONArray(“餐厅”);
for(int i=0;i

稍微澄清一下。第一行基本上是jsonFile中表示为字符串的文本。起初,我将这些值添加到一个简单的字符串数组中,但后来我将其更改为ArrayList,因为如果我使用for-each循环,这将是合乎逻辑的。我尝试使用org.json.simple、net.sf.json作为替代,但这两个库都无法实现

您可以使用迭代器,因为JsonArray提供了getIterator方法。但是,这些是原始迭代器,因此没有与之关联的特定类型(因此每个元素都被视为对象)。不过你可以让他们失望

    ArrayList<String> list = new ArrayList<>();
    String strJson = loadJsonFromAssetsFolder();
    JSONObject jsonRootObject = new JSONObject(strJson);
    JSONArray jsonArray = jsonRootObject.optJSONArray("restaurant");
    for (Object jsonObject : jsonArray) {
        list.add(((JSONObject) jsonObject).optString("name"));
    }
ArrayList list=new ArrayList();
字符串strJson=LoadJsonFromAssetFolder();
JSONObject jsonRootObject=新的JSONObject(strJson);
JSONArray JSONArray=jsonRootObject.optJSONArray(“餐厅”);
对于(对象jsonObject:jsonArray){
添加((JSONObject)JSONObject.optString(“名称”);
}
有什么理由不想使用普通for循环吗?真的没有区别。
您还可以研究像GSON这样的库,它可以将它映射到Java对象

您可以使用迭代器,因为JsonArray提供了getIterator方法。但是,这些是原始迭代器,因此没有与之关联的特定类型(因此每个元素都被视为对象)。不过你可以让他们失望

    ArrayList<String> list = new ArrayList<>();
    String strJson = loadJsonFromAssetsFolder();
    JSONObject jsonRootObject = new JSONObject(strJson);
    JSONArray jsonArray = jsonRootObject.optJSONArray("restaurant");
    for (Object jsonObject : jsonArray) {
        list.add(((JSONObject) jsonObject).optString("name"));
    }
ArrayList list=new ArrayList();
字符串strJson=LoadJsonFromAssetFolder();
JSONObject jsonRootObject=新的JSONObject(strJson);
JSONArray JSONArray=jsonRootObject.optJSONArray(“餐厅”);
对于(对象jsonObject:jsonArray){
添加((JSONObject)JSONObject.optString(“名称”);
}
有什么理由不想使用普通for循环吗?真的没有区别。
您还可以研究像GSON这样的库,它可以将它映射到Java对象

好的,问题是它在正常的for循环中工作得非常好(从我的角度来看),但是我的一个团队成员(我们正在进行的这个项目)审查了我的代码(并且比我有更多的exp),他告诉我,如果我使用foreach循环访问数组的一个元素会更好,因为正常的可以“不必要地遍历整个阵列“例如,如果我想访问循环最后一次迭代中的最后一个元素。顺便说一句,我已经试过你的建议了,但是没有用,foreach对于org.json来说是不可能的。谢谢你的回答@梅托迪你说它不起作用是什么意思?上面的代码运行得非常好。我不明白你的队友在说什么。迭代是完全相同的,唯一的区别是您将丢失索引变量,并且数组长度只计算一次,您也可以手动进行计算。当我使用foreach循环时,会收到一条错误消息:“foreach不适用于org.json.JSONArray类型”。如果我使用了另一个库,这将起作用,但这意味着我需要改变几乎所有的东西,这将是非常恼人的,因为我已经尝试过了。我还要等待他的回答,因为我还认为foreach相当于for循环,只是通过去掉索引来缩短代码。@Metodi这很奇怪。for(Object-jsonObject:jsonArray)适用于2016和2017年的org.json版本。您使用的是哪个版本?@Metodi刚刚检查过,google确实重新实现了org.json版本,因此它有一个不同的API(例如,没有迭代器方法,所以foreach无法工作)。好吧,问题是它在正常的for循环中运行得非常好(从我的角度来看),但是我的一个团队成员(对于我们正在进行的这个项目)审查了我的代码(exp比我多得多)的人告诉我,如果我使用foreach循环访问数组的一个元素会更好,因为正常的循环可能“不必要地遍历整个数组”例如,如果我想访问循环最后一次迭代中的最后一个元素。顺便说一句,我已经尝试了你的建议,但没有效果,foreach对于org.json来说是不可能的。谢谢你的回答!@Metodi你说它不起作用是什么意思?上面的代码运行得非常好。我没有从你的队友那里得到论证。答案是同样,唯一的区别是您将丢失索引变量,并且数组长度只计算一次,您也可以手动执行。当我使用foreach循环时,会收到一条错误消息:“foreach不适用于org.json.JSONArray类型”。如果我使用不同的库,这会起作用,但这意味着我需要更改几乎所有内容,这会非常恼人,因为我已经尝试过了。我也要等待他的答案,因为我还认为foreach相当于for循环,只是通过去掉索引来缩短代码。@Metodi T这很奇怪。for(Object jsonObject:jsonArray)适用于我2016年和2017年的org.json版本。你使用的是哪个版本?@Metodi刚刚检查过,谷歌确实重新实现了org.json版本,所以它有一个不同的API(例如