利用網絡通信獲得並解析JSON

   我們知道,手機上信息的顯示與更新,均來自於網絡中的服務器等。而像新浪這樣對外開放接口,我們根據接口的規範等獲得我們想要的數據,這時就需要我們運用網絡通信的知識,去獲得他返回給我們的字串,我們往往得到的是想JSON等這樣的字串,我們要把它解析出來,獲得數據位我們所用。

   這裏我們採用的是HttpClient的網絡通信方式,獲得存在於服務器中的JSON字符串,通過解析,得到數據,並通過適配器,適配到ListView控件上。

   ◆具體操作:

   (1)我們搭建一個服務器,並扔裏面一個json格式的文件,打開服務器,等待連接。這裏我用到的JSON數據文件爲

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
{"statuses": [
{"calendar_id":"1705","title":"(\u4eb2\u5b50)ddssd","category_name":"\u9ed8\u8ba4\u5206\u7c7b","showtime":"1288927800","endshowtime":"1288931400","allDay":false,"user":{"id":1222}},
{"calendar_id":"1706","title":"(\u65c5\u884c)","category_name":"\u9ed8\u8ba4\u5206\u7c7b","showtime":"1288933200","endshowtime":"1288936800","allDay":false,"user":{"id":1222}}
] }


   (2)先編寫程序,獲得服務器中JSON文件中的內容,以String的形式讀取。(這裏我直接給出源碼,若有不明白之處,可參見上一篇博文)

//實例化數據請求對象
            httpGet = new HttpGet(
                    "http://222.27.166.10:8080/MyServer/jsonindex.jsp");
            httpClient = new DefaultHttpClient();//實例化客戶端對象
            httpResponse = httpClient.execute(httpGet);//實例化響應對象
            httpEntity = httpResponse.getEntity();//獲得響應中的數據並存儲
            in = httpEntity.getContent();//獲得數據內容
            BufferedReader br = new BufferedReader(new InputStreamReader(in));//讀取流
            String line = null;
            StringBuffer sb = new StringBuffer();
            while ((line = br.readLine()) != null) {
                sb.append(line);//此時的sb中的內容其實就是JSON形式的字符串
            }

   (3)編一個方法,解析JSON字符串。這裏面涉及到一個數組,每一個JSON對象也可以是幾個JSON對象的集合,我們把這個承載JSON對象的集合叫做JSON數組,數組的解析用到了JSONArray,通過json對象的get(由JSON數組組成的JSON對象的鍵名)來獲得。具體如下

//JSON字符串的解析,我在前面的博文中也有講解
    public List<HashMap<String, Object>> parseJSON(String str) {
        List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
        HashMap<String, Object> map ;
        try {
            JSONObject json = new JSONObject(str);//根據傳入的的字符串獲得JSON對象昂
            JSONArray js = (JSONArray) json.get("statuses");//通過鍵獲得JSON數組
            for (int i = 0; i < js.length(); i++) {//循環數組讀取數據
                map = new HashMap<String, Object>();
                JSONObject jo = (JSONObject) js.get(i);//每一個數組又是一個JSON對象
                map.put("calendar_id", jo.getString("calendar_id"));//數據的存儲
                map.put("title", jo.getString("title"));
                map.put("category_name", jo.getString("category_name"));
                map.put("showtime", jo.getString("showtime"));
                map.put("endshowtime", jo.getString("endshowtime"));
                map.put("allDay", jo.getBoolean("allDay"));
                JSONObject joo = jo.getJSONObject("user");//這裏又嵌套了一個JSON對象
                map.put("id", joo.getString("id"));
                list.add(map);//添加數據到List中
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return list;//返回存儲數據的list
    }

   (4)聲明,並實例化ListView及適配器,完成適配。(這裏的代碼,應直接跟着第二個操作後邊寫出)

//給數據源賦值並強制轉換
            list = (ArrayList<HashMap<String, Object>>) parseJSON(sb
                    .toString());
            //實例化適配器,進行數據的存儲
            //這裏的new String中的數據爲JSON中的鍵名稱,new int中的爲自定義佈局中控件的ID
            //由於這裏的JSON數據已經得到,通過輸出,可以看出每一個JSON對象共7條數據,所以這裏用7
            //個控件去承載數據
        adpater = new SimpleAdapter(this, list, R.layout.cell, new String[]{
                "calendar_id","title","category_name","showtime","endshowtime","allDay","id"
        }, new int[]{R.id.textView1,R.id.textView2,R.id.textView3,R.id.textView4,         
                R.id.textView5,R.id.textView6,R.id.textView7});
                //適配Listview
            lv.setAdapter(adpater);

   ◆結果:在模擬器上出現了裝滿數據的Listview控件,可見裏面的數據的解析出來了。

   JSON字符串的網絡獲取與解析對我們來說很重要,也是一個必須掌握的東西啊。。加油吧。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章