利用網絡通訊得到並解析JSON

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

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

   ◆具體操做:
json

   (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及適配器,完成適配。(這裏的代碼,應直接跟着第二個操做後邊寫出)
app

//給數據源賦值並強制轉換
            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控件,可見裏面的數據的解析出來了。
jsp

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

相關文章
相關標籤/搜索