我們知道,手機上信息的顯示與更新,均來自於網絡中的服務器等。而像新浪這樣對外開放接口,我們根據接口的規範等獲得我們想要的數據,這時就需要我們運用網絡通信的知識,去獲得他返回給我們的字串,我們往往得到的是想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字符串的網絡獲取與解析對我們來說很重要,也是一個必須掌握的東西啊。。加油吧。。