【问题标题】:Android JSON parsing using Volley使用 Volley 解析 Android JSON
【发布时间】:2015-05-02 02:30:04
【问题描述】:

好的,我的question 的答案建议用于 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" }]}]

【问题讨论】:

  • Volley 也有 JsonObjectRequest 但如果您将 String 作为响应,那么为什么不使用 Gson 或 Jackson 库将您的文本反序列化大约一行?
  • 我没用过Gson或者Jackson,给我指点方向,这里没有太多经验
  • 如果你愿意,我可以在 Gson 中编写代码。
  • 那会有很大帮助

标签: android json gson android-volley


【解决方案1】:

这就是我对 Gson 的处理方式。 首要任务是添加库。我当然希望您使用的是 Android Studio,因此您可以在 build.gradle 中添加它

compile 'com.google.code.gson:gson:2.3.1'


然后我们将响应模仿为相应的普通旧 java 对象(PO​​JO)。基本上我们定义了几个类,它们的成员反映了 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 对象,您可以轻松地获取或设置它的任何内容。说要得到第一篇文章的标题就行了

String titleOfFirstPost = wrap.getPosts().get(0).getTitle();

【讨论】:

    【解决方案2】:

    感谢@inmyth 为我的问题构建了一个简单的解决方案。我最终在 onResponse 方法中得到了这段代码:

     public void onResponse(String response) {
                        Wrap wrap = new Gson().fromJson(response, Wrap.class);
    
                        for(Post post : wrap.getPosts()){
                            adapter.add(post);
                        }
    

    你可以在here上看到整个代码

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多