如何访问JSON对象中的嵌套数组(Android)

时间:2015-05-31 00:58:37

标签: android arrays json object nested

我的JSON的结构是,

"posts":[
    //Post 1.        
    {
        "images":{
            "small":{
                "url": "http://..."
                "width": 64
            },
            "large":{
                "url": "http://..."
                "width": 128
            }
        },

        "caption":"..."
    },

    {
        //Post 2
        "images":{
            "small":{
                "url": "http://..."
                "width": 64
            },
            "large":{
                "url": "http://..."
                "width": 128
            }
        },

        "caption":"..."

     } 
]

我想知道,帖子 - >图像 - >大 - > url 来自每个帖子的字符串形式。

这就是我所做的:

JSONArray jsonarray = jsonobject.getJSONArray("posts");

for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    JSONArray innerArray1 = jsonobject.getJSONArray("images");
    JSONArray innerArray2 = innerArray1.getJSONArray(0);    //gets "large"
    JSONArray innerArray3 = innerArray2.getJSONArray(1);    //gets "url"
    String finalString = innerArray3.toString();
}

我期待&#34; url&#34;在finalString中,除了它最终为空。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

“images”,“small”,“large”是 JSONObjects (注意花括号),而不是JSONArrays(方括号),你需要提取它们。

JSONArray jsonarray = jsonobject.getJSONArray("posts");

for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    JSONObject innerObject1 = jsonobject.getJSONObject("images");
    JSONObject innerObject2 = innerObject1.getJSONObject("large");    //gets "large"
    String finalString = innerObject2.getString("url");
}

答案 1 :(得分:2)

只需使用Retrofit和GSON

构建一些名为Posts.java Post.java Image.java

的模型类

<强> Posts.java

public class Posts {

   @SerializedName("posts")
   private List<Post> mPosts;
   public List<Post> getPosts() {
        return mPosts;
   }

}

<强> Post.java

public class Post {

   @SerializedName("image")
   private Image mImage;
   public Image getImage() {
        return mImage;
   }

   @SerializedName("caption")
   public String mCaption;
   public String getCaption() {
       return mCaption;
   }

}

<强> Image.java

public class Image {

   @SerializedName("small")
   private String mSmallImageUrl;
   public Image getSmallImageUrl() {
        return mSmallimageUrl;
   }

   @SerializedName("large")
   public String mLargeImageUrl;
   public String getLargeImageUrl() {
       return mLargeImageUrl;
   }

}

SerializedName注释来自GSON库,该库应该已经是您可以实现的Android Studio库包的一部分。

它实际上为您创建了POJO个对象,您只需要创建模型类。

通过改造,实现很简单,因为您在某处声明RestAdapter

public class Client {

        public static final String API_URL = ".......";

        // Constructor which you can initialize somewhere else.
        public Client() {

                RestAdapter mAsyncRestAdapter = new RestAdapter.Builder()
                                     .setEndpoint(API_URL)
                                     .setClient(new OkClient(new OkHttpClient()))
                                     .build();

        }

        // Implement Interfaces here somewhere. 

}

然后为你的api端点创建接口,这样可以解决问题。请注意GET注释来自改造。改造还允许POST PUT DELETE等:

public interface IPosts {

     @GET("/posts")
     void getPosts(Callback<Posts> callback);

}

请注意,Callback是一个改进的回调,在200 OK状态后,它会从API获取Response并将JSON转换为Posts与GSON对象。

您可以像这样实现界面:

public void getPosts(Callback<Posts> callback) {
    IPosts posts = mAsyncRestAdapter.create(IPosts.class);
    posts.getPosts(callback);
}

您应用中的某个位置只需创建以下回调:

Callback<Posts> callback = new Callback<Posts>() {

    @Override
    public void onSuccess(Posts posts, Response response) {
        // Do whatever you want with posts here
        List<Post> posts = posts.getPosts(); // Get posts for example

    }

    @Override
    public void onFailure(RetrofitError error) {
        // Handle the error

    }

};

// Pass this callback to the implementation of the interface to have it actually work
mClient.getPosts(callback);

这是您可以轻松访问嵌套JSON对象的一种方法。使用GSON进行改造是一种真正的乐趣。这种方法的优点是你所要做的就是定义回调,接口和模型。您可以从中看到代码非常小并且分离。