Android JSON 使用 Volley 解析
Android JSON parsing using Volley
好的,所以我的 的答案建议用于 Volley 实施。我确实尝试了一些示例,阅读了一些文章,是的,我对 Volley 感到有点兴奋,它可以让我的应用程序生活更轻松。但是那里没有很多文档,对于像我这样的新手,我发现很难实现它。
这是我卡住的地方:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
StringRequest movieReq = new StringRequest(url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());
arrayList = new ArrayList<HashMap<String, String>>();
try {
jsonArray = jsonObject.getJSONArray("posts");
for (int z = 0; z < jsonArray.length(); z++) {
HashMap<String, String> map = new HashMap<String, String>();
JSONObject jsonObject1 = jsonArray.getJSONObject(z);
String url = jsonObject1.getString("url");
String title = jsonObject1.getString("title");
String content = jsonObject1.getString("content");
map.put(SHAREURL, url);
map.put(TITLE, title);
map.put(CONTENT, content);
JSONArray jsonArray1 = jsonObject1.getJSONArray("attachments");
for (int j = 0; j < jsonArray1.length(); j++) {
JSONObject jsonObject2 = jsonArray1.getJSONObject(j);
String urlImage = jsonObject2.getString("url");
map.put(URL, urlImage);
arrayList.add(map);
}
}
} catch (JSONException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
listView = (ListView) mActivity.findViewById(android.R.id.list);
adapter = new ListViewAdapter(mActivity, arrayList);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
}
});
AppController.getInstance().addToRequestQueue(movieReq);
这是使用 JSON
格式化的页面
"posts" : [{
"title":"Fast and Furious",
"url":"example.com",
"content":"example",
"attachments":[{
"url":"example.jpg" }]}]
这就是我使用 Gson 的方式。
首要任务是添加库。我当然希望您使用的是 Android Studio,这样您就可以将其添加到您的 build.gradle
compile 'com.google.code.gson:gson:2.3.1'
然后我们将响应模仿为相应的普通旧 java object (POJO)。基本上我们定义了几个 类 ,它们的成员反映了 json 文本中的类型和名称,就像这样。 (您需要将其与示例的响应文本相匹配)
class Attachment {
private String url;
public String getUrl(){
return url;
}
public String setUrl(String url){
this.url = url;
}
}
class Post {
private String title; //make sure each variable name is the same
//as the field in json text
private String url;
private String content;
private ArrayList<Attachment> attachments;
// add getters and setters as needed. Again this can be accomplished easily
// in Android Studio
}
class Wrap {
private ArrayList<Post> posts;
}
现在我们回到您的Volley.onResponse,我们只是这样做
@Override
public void onResponse(String response) {
Wrap wrap = new Gson().fromJson(response, Wrap.class);
}
好了,只有一行,跳过了所有痛苦的迭代。
现在您有了这个 Wrap object,您可以轻松地获取或设置它的任何内容。说拿第一个的标题post就做
String titleOfFirstPost = wrap.getPosts().get(0).getTitle();
感谢@inmyth 为我的问题构建了一个简单的解决方案。我在 onResponse 方法中得到了这段代码:
public void onResponse(String response) {
Wrap wrap = new Gson().fromJson(response, Wrap.class);
for(Post post : wrap.getPosts()){
adapter.add(post);
}
您可以在 here
上查看完整代码
好的,所以我的
这是我卡住的地方:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
StringRequest movieReq = new StringRequest(url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());
arrayList = new ArrayList<HashMap<String, String>>();
try {
jsonArray = jsonObject.getJSONArray("posts");
for (int z = 0; z < jsonArray.length(); z++) {
HashMap<String, String> map = new HashMap<String, String>();
JSONObject jsonObject1 = jsonArray.getJSONObject(z);
String url = jsonObject1.getString("url");
String title = jsonObject1.getString("title");
String content = jsonObject1.getString("content");
map.put(SHAREURL, url);
map.put(TITLE, title);
map.put(CONTENT, content);
JSONArray jsonArray1 = jsonObject1.getJSONArray("attachments");
for (int j = 0; j < jsonArray1.length(); j++) {
JSONObject jsonObject2 = jsonArray1.getJSONObject(j);
String urlImage = jsonObject2.getString("url");
map.put(URL, urlImage);
arrayList.add(map);
}
}
} catch (JSONException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
listView = (ListView) mActivity.findViewById(android.R.id.list);
adapter = new ListViewAdapter(mActivity, arrayList);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
}
});
AppController.getInstance().addToRequestQueue(movieReq);
这是使用 JSON
格式化的页面"posts" : [{
"title":"Fast and Furious",
"url":"example.com",
"content":"example",
"attachments":[{
"url":"example.jpg" }]}]
这就是我使用 Gson 的方式。 首要任务是添加库。我当然希望您使用的是 Android Studio,这样您就可以将其添加到您的 build.gradle
compile 'com.google.code.gson:gson:2.3.1'
然后我们将响应模仿为相应的普通旧 java object (POJO)。基本上我们定义了几个 类 ,它们的成员反映了 json 文本中的类型和名称,就像这样。 (您需要将其与示例的响应文本相匹配)
class Attachment {
private String url;
public String getUrl(){
return url;
}
public String setUrl(String url){
this.url = url;
}
}
class Post {
private String title; //make sure each variable name is the same
//as the field in json text
private String url;
private String content;
private ArrayList<Attachment> attachments;
// add getters and setters as needed. Again this can be accomplished easily
// in Android Studio
}
class Wrap {
private ArrayList<Post> posts;
}
现在我们回到您的Volley.onResponse,我们只是这样做
@Override
public void onResponse(String response) {
Wrap wrap = new Gson().fromJson(response, Wrap.class);
}
好了,只有一行,跳过了所有痛苦的迭代。 现在您有了这个 Wrap object,您可以轻松地获取或设置它的任何内容。说拿第一个的标题post就做
String titleOfFirstPost = wrap.getPosts().get(0).getTitle();
感谢@inmyth 为我的问题构建了一个简单的解决方案。我在 onResponse 方法中得到了这段代码:
public void onResponse(String response) {
Wrap wrap = new Gson().fromJson(response, Wrap.class);
for(Post post : wrap.getPosts()){
adapter.add(post);
}
您可以在 here
上查看完整代码