如何在 Android 中使用 Java 和 org.json 迭代这个 JSON 数组?

Posted

技术标签:

【中文标题】如何在 Android 中使用 Java 和 org.json 迭代这个 JSON 数组?【英文标题】:How to iterate this JSON Array using Java and org.json in Android? 【发布时间】:2012-02-16 07:31:18 【问题描述】:

我的 JSON 字符串如下所示(包含在名为 sJSON 的字符串变量中):

[
    "id":284
],
[
    "name":John,"surname":Doe,
    "name":Jane,"surname":Doe
]

我能够像这样解析第一个数组(使用 Java 并导入 org.json):

JSONArray arrJSON = new JSONArray(sJSON);
JSONObject jsonGeneralData = new JSONObject(arrJSON.get(0).toString());

String sResult = jsonGeneralData.get("id").toString();

这将返回预期结果,即 284。我正在努力获取第二个项目数组并遍历它们。我不确定我的 JSON 字符串是否格式错误,或者我是否试图以错误的方式访问它。这是我尝试过的:

JSONObject jsonPersonData = new JSONObject(arrJSON.get(1).toString());

据我所知,我不知道如何循环遍历第二个数组中的各个项目。

编辑:

看来这一行只解析方括号中的第一个字符串:

JSONArray arrJSON = new JSONArray(sJSON);

要么 JSON 错误(与上面的示例相同),要么它没有正确解析它?我已经设法通过对字符串进行拆分并将它们各自放在自己的JSONArray 中来解决问题,但我认为这不是最好的处理方式。

【问题讨论】:

用更多信息更新了原始帖子。 递归一:gist.github.com/anonymous/89f8163fb22f77f4f9d3 【参考方案1】:

您应该使用 arrJson 对象访问数据,而不是使用它们的字符串结果创建新的 JSONObject。

【讨论】:

【参考方案2】:

你想要这样的东西..

JSONArray jsonArray = new JSONArray(sJSON);
JSONArray jsonPersonData = jsonArray.getJSONArray(1);
for (int i=0; i<jsonPersonData.length(); i++) 
    JSONObject item = jsonPersonData.getJSONObject(i);
    String name = item.getString("name");
    String surname = item.getString("surname");

【讨论】:

【参考方案3】:

您不应该使用 JSONObject.toString。这就是你应该如何迭代你的数组:

for(int i=0;i<arrJSON.length();i++)
JSONObject json_data = jArray.getJSONObject(i);
String name =json_data.getString("name");
String surname =json_data.getString("surname"); 

【讨论】:

【参考方案4】:

您可以使用迭代器进行迭代,我还为您复制了一个示例 JSON 字符串,希望对您有所帮助:

  //   "drives":
    //["drives_id":"2","ip":"hq10m.backupexample.com","port":"4010","ftp_username":"NameSFTP","
    // ftp_password":"12345","permission":2,"drive_name":"dev"
    //,"drive_letter":"S","size":"1234","ma_mode":"0",
    //"drives_id":"3","ip":"hq6m.backupexample.com","port":"4206","ftp_username":"userSFTP"
//,"ftp_password":"456","permission":2,"drive_name":"Rashtesting"
//,"drive_letter":"P","size":"8","ma_mode":"0"],"user_id":"8"

      mi.setUser_id( (int) Long.parseLong(obj.get("user_id").toString()));
      JSONArray drivesarray= (JSONArray) obj.get("drives");
      Iterator<JSONObject> driveIterator=drivesarray.iterator();
      while(driveIterator.hasNext())
      
          JSONObject driveJSON=driveIterator.next();
          client_drive_info drive=new client_drive_info();
          drive.setDrives_id((int) Long.parseLong(driveJSON.get("drives_id").toString()));
          drive.setIp(driveJSON.get("ip" ).toString());
          drive.setPort((int )Long.parseLong(driveJSON.get("port").toString()));
          drive.setSFTPusername(driveJSON.get("ftp_username").toString());
          drive.setSFTPpassword(driveJSON.get( "ftp_password").toString());
          drive.setPermission((int )Long.parseLong(driveJSON.get("permission").toString()));
          drive.setDrive_name(driveJSON.get("drive_name").toString());
          drive.setDrive_letter(driveJSON.get("drive_letter").toString());
          drive.setSize((int )Long.parseLong(driveJSON.get("size").toString()));

          mi.getDrives_info().add(drive);
      

【讨论】:

您可能需要考虑使用JSONObject.getString()

以上是关于如何在 Android 中使用 Java 和 org.json 迭代这个 JSON 数组?的主要内容,如果未能解决你的问题,请参考以下文章

Android N requires the IDE to be running with Java 1.8 or later

Eclipse Android项目 为控件添加了Id,但是在Java代码中提示xxx cannot be resolved or is not a field

如何在 Java 中使用 OR-Tools 从多个 IntExpr 创建 IntExpr,与 Python 中相同

如何在 Gradle 构建脚本(Android)中定义和使用常量?

Kotlin OR Java?快来站队

java - 如何从java中的executeUpdate OR update中获取值?