2015-05-02 83 views
0

好的,對我的question的回答建議用於Volley實現。我確實嘗試了一些例子,閱讀了一些文章,並且對於Volley我有點興奮,它可以讓我的應用程序生活更輕鬆。但是那裏沒有很多文檔,對於像我這樣的新手來說,我發現它很難實現它。使用Volley對Android JSON進行解析

這裏就是我堅持:

@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" }]}] 
+0

排球也有JsonObjectRequest但如果你把String作爲響應,那麼爲什麼不使用GSON或傑克遜庫,反序列化你的文字在一行左右? – inmyth

+0

我從來沒有使用過Gson或Jackson,只是指出我在正確的方向,沒有太多的經驗在這裏 – kinsell

+0

如果你想我可以在Gson代碼如何工作。 – inmyth

回答

1

這是我如何與GSON做格式化的頁面。 業務的第一步是添加庫。我當然希望您的Android工作室,這樣你可以在你的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(); 
0

感謝@inmyth爲我的問題構建一個簡單的解決方案。我結束了這段代碼在onResponse方法:

public void onResponse(String response) { 
        Wrap wrap = new Gson().fromJson(response, Wrap.class); 

        for(Post post : wrap.getPosts()){ 
         adapter.add(post); 
        } 

你可以看到整個代碼在here

相關問題