利用网络通讯得到并解析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

相关文章
相关标签/搜索