【问题标题】:JSON Array iteration in Android/JavaAndroid/Java 中的 JSON 数组迭代
【发布时间】: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 转换为可迭代数组。有什么想法可以实现吗?

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

【问题讨论】:

标签: java android arrays json


【解决方案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 的方法。见这里:stackoverflow.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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-16
          • 1970-01-01
          • 2014-05-04
          • 1970-01-01
          • 2013-11-10
          • 2018-03-23
          相关资源
          最近更新 更多