代码之家  ›  专栏  ›  技术社区  ›  Kevin Bradshaw

Android/Java中的JSON数组迭代

  •  142
  • Kevin Bradshaw  · 技术社区  · 15 年前

    我正在构建一个android应用程序,它需要下载并与在线数据库同步,我正在将我的查询从应用程序发送到一个php页面,该页面以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转换成可编辑的数组。你知道我怎么能做到吗?

    8 回复  |  直到 11 年前
        1
  •  68
  •   slinden77    9 年前

    我用了两种不同的方法,

    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 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));
            }
        }
    
        2
  •  337
  •   michaelb958--GoFundMonica Mong Tararak Ruchirabha    12 年前

    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
  •  7
  •   Ivan86    6 年前

    不幸的是, JSONArray 支持 foreach

    for(JSONObject someObj : someJsonArray) {
        // do something about someObj
        ....
        ....
    }
        4
  •  5
  •   Graham S.    9 年前

    当我尝试@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...
    }
    
        5
  •  3
  •   Thunderforge    12 年前

    如果你用的是 JSON.org Java implementation ,这是开源的,您只需让JSONArray实现 Iterable 接口并将以下方法添加到类中:

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

    这将使JSONArray的所有实例都不可编辑,这意味着 for (Object foo : bar)

        6
  •  3
  •   yivi SilverLink    7 年前

    在数组上,查找:

    JSONArray menuitemArray = popupObject.getJSONArray("menuitem"); 
    
        7
  •  2
  •   Andriya    10 年前

    您对每个条目使用相同的强制转换对象。

    此代码应修复它:

    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
  •  1
  •   18446744073709551615    12 年前

    在迭代JSON数组(org.JSON.JSONArray,内置于Android中)时,请注意 无效的 物体;例如,你可能会 "null" 而不是 字符串。

    支票可能看起来像:

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