我的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中,除了它最终为空。
我做错了什么?
答案 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进行改造是一种真正的乐趣。这种方法的优点是你所要做的就是定义回调,接口和模型。您可以从中看到代码非常小并且分离。