咱们知道,手机上信息的显示与更新,均来自于网络中的服务器等。而像新浪这样对外开放接口,咱们根据接口的规范等得到咱们想要的数据,这时就须要咱们运用网络通讯的知识,去得到他返回给咱们的字串,咱们每每获得的是想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); |