如何在 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
数组中的 title
和 url
。到目前为止我已经试过了。
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
中显示 title
和 url
,在 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
的每个项目中的 TextView
和 ImageView
中显示正确的数据。
要在您的 Android 项目中添加 Gson,您只需在 build.gradle
中添加以下依赖项。
dependencies {
compile 'com.google.code.gson:gson:2.4'
}
这是我的 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
数组中的 title
和 url
。到目前为止我已经试过了。
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
中显示 title
和 url
,在 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
的每个项目中的 TextView
和 ImageView
中显示正确的数据。
要在您的 Android 项目中添加 Gson,您只需在 build.gradle
中添加以下依赖项。
dependencies {
compile 'com.google.code.gson:gson:2.4'
}