如何在 android 中解析嵌套的 JSONArray

how to parse Nested JSONArray in android

这是我的 json :

{
  "posts": [
    {    
      "id": "c200",
      "title": "erfan",
      "email": "erfan@gmail.com",
      "address": "xx-xx-xxxx,x - street, x - country",
      "gender" : "male",
  "attachments":[
  {
    "url":"http://memaraneha.ir/wp-content/uploads/2016/11/light.jpg"
  }]},
  {
    "id": "c201",
    "name": "Johnny Depp",
    "email": "johnny_depp@gmail.com",
    "address": "xx-xx-xxxx,x - street, x - country",
    "gender" : "male",
    "attachments":[
    {
      "url":"http://memaraneha.ir/wp-content/uploads/2016/11/renovate-old-home.jpg"}]
    }]
}

我想获取 attachments 数组中的 titleurl。到目前为止我已经试过了。

try {
    JSONObject jsonObj = new JSONObject(jsonStr);
    jsonContent jsonContent = new jsonContent(); //my class 

    JSONArray posts = jsonObj.getJSONArray("posts");

    for (int i = 0; i < posts.length(); i++) {
        JSONObject c = posts.getJSONObject(i);
        jsonContent.title = c.getString("title");

        JSONArray attachments=c.getJSONArray("attachments");

        for (int j=0;j<attachments.length();j++) {
            JSONObject a=attachments.getJSONObject(j);                     
            jsonContent.imgurl=a.getString("url");
        }

        listcontent.add(jsonContent);    //mylist
    }
} catch(Exception e) {}

然后我在 TextView 中显示 titleurl,在 RecyclerView 中显示 ImageView。在卡片 1 中,我显示了解析后的 json 中的第一个标题和图像,效果很好。但问题出在卡片 2 上,它显示了卡片 1 的标题和图片,不管我们有多少 json 数据,它只是在我 RecyclerView 的所有项目中显示相同的标题和图片.

这是用于解析 Json 响应的 POJO。

public class jsonContent {
    public String title;
    public String imgurl;
}

您需要在每个循环中创建新的 jsonContent 对象,因为目前您只是在每次迭代中更改同一对象的值并将其添加到列表中。

 jsonContent jsonContent=null; //my class 

    JSONArray posts = jsonObj.getJSONArray("posts");
    for (int i = 0; i < posts.length(); i++) {
        jsonContent=new jsonContent(); //my class 
        //          ^^^^^^^^  create new object   
        JSONObject c = posts.getJSONObject(i);
        jsonContent.title=c.getString("title");

        JSONArray attachments=c.getJSONArray("attachments");
        for (int j=0;j<attachments.length();j++)
        {
            JSONObject a=attachments.getJSONObject(j);                     
            jsonContent.imgurl=a.getString("url");
        }
        listcontent.add(jsonContent);    //mylist
   }

改进:使用 getter 和 setter 函数而不是将 class 字段公开为 public

我建议使用 Gson 来解析您的 json 字符串。它干净且易于使用。

在您的情况下,您可能必须创建这些 类。

public class jsonContent {
    public String id;
    public String title;
    public String email;
    public String address;
    public String gender;
    public Attachment[] attachments;
}

public class Attachment {
    public String[] url;
}

现在您的 POJO 已创建,您现在可以使用 Gson 来解析您到达那里的 json 字符串。

Gson gson = new Gson();
jsonContent[] postArray = gson.fromJson(jsonStr, jsonContent[].class);

现在将此 postArray 传递给您的适配器并遍历数组以在 RecyclerView 的每个项目中的 TextViewImageView 中显示正确的数据。

要在您的 Android 项目中添加 Gson,您只需在 build.gradle 中添加以下依赖项。

dependencies {
    compile 'com.google.code.gson:gson:2.4'
}