我们知道,手机上信息的显示与更新,均来自于网络中的服务器等。而像新浪这样对外开放接口,我们根据接口的规范等获得我们想要的数据,这时就需要我们运用网络通信的知识,去获得他返回给我们的字串,我们往往得到的是想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控件,可见里面的数据的解析出来了。082145273.jpg

   JSON字符串的网络获取与解析对我们来说很重要,也是一个必须掌握的东西啊。。加油吧。。j_0015.gif