Android/Java 中的 JSON 数组迭代

Posted

技术标签:

【中文标题】Android/Java 中的 JSON 数组迭代【英文标题】:JSON Array iteration in Android/Java 【发布时间】:2022-01-19 00:36:26 【问题描述】:

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

我为我的含糊之处道歉,但我从网上找到的一个例子中得到了这个结果,此后一直找不到它。

【问题讨论】:

查看以下链接:androidbeasts.wordpress.com/2015/08/04/json-parsing-tutorial 【参考方案1】:

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

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

这就是你要找的吗?

【讨论】:

又好又简单!效果很好! 注意,如果你发送一个没有连续数字的“数组”,你必须使用JSONObject 是的,它很完美,但是虽然数据量很大,但它的处理速度非常慢:( @ArslanAhmad 如果你有大量数据,你不希望在内存中构造整个 json 对象数组。而是使用类似 SAX 的方法。见这里:***.com/questions/10657725/… 这对我不起作用。由于对象周围的“”括号,我得到一个 JSON 异常?【参考方案2】:

我有两种不同的方法,

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

【讨论】:

【参考方案3】:

很遗憾,JSONArray 支持foreach 语句,例如:

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

【讨论】:

可以,但返回的对象不是 JSONObject JSONArray 类没有实现 Iterable 接口【参考方案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()【参考方案5】:

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

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

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

【讨论】:

有趣的是,JSON.org 实现曾经在 JSONArray 类中有一个迭代器,但他们删除了它:github.com/douglascrockford/JSON-java/commit/… @vipw 我曾经向他们发送过关于实现 Iterable 的电子邮件,但他们说最终他们不能这样做,因为这会破坏与 Java 1.4 的兼容性。也许这就是它在提交中被删除的原因。【参考方案6】:

在数组上,寻找:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

支票可能如下所示:

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

【讨论】:

以上是关于Android/Java 中的 JSON 数组迭代的主要内容,如果未能解决你的问题,请参考以下文章

在 android [JAVA] 中的多个 Arraylist 中添加 JSON 数组

使用 Flutter FutureBuilder 迭代 JSON 中的对象数组

JSON 数组迭代 - Mulesoft 4 中的树遍历

如何迭代sqlite中嵌套json对象中的数组?

如何迭代由json对象中的键访问的数组[重复]

在 ngFor 的帮助下迭代 Angular5 中的 JSON 数组