我们知道,手机上信息的显示与更新,均来自于网络中的服务器等。而像新浪这样对外开放接口,我们根据接口的规范等获得我们想要的数据,这时就需要我们运用网络通信的知识,去获得他返回给我们的字串,我们往往得到的是想JSON等这样的字串,我们要把它解析出来,获得数据位我们所用。
这里我们采用的是HttpClient的网络通信方式,获得存在于服务器中的JSON字符串,通过解析,得到数据,并通过适配器,适配到ListView控件上。
◆具体操作:
(1)我们搭建一个服务器,并扔里面一个json格式的文件,打开服务器,等待连接。这里我用到的JSON数据文件为
|
1
2
3
4
5
6
|
<%@ 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的形式读取。(这里我直接给出源码,若有不明白之处,可参见上一篇博文)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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);
}
|
|
(3)编一个方法,解析JSON字符串。这里面涉及到一个数组,每一个JSON对象也可以是几个JSON对象的集合,我们把这个承载JSON对象的集合叫做JSON数组,数组的解析用到了JSONArray,通过json对象的get(由JSON数组组成的JSON对象的键名)来获得。具体如下
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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);
JSONArray js = (JSONArray) json.get("statuses");
for (int i = 0; i < js.length(); i++) {
map = new HashMap<String, Object>();
JSONObject jo = (JSONObject) js.get(i);
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");
map.put("id", joo.getString("id"));
list.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
|
|
(4)声明,并实例化ListView及适配器,完成适配。(这里的代码,应直接跟着第二个操作后边写出)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
list = (ArrayList<HashMap<String, Object>>) parseJSON(sb
.toString());
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});
lv.setAdapter(adpater);
|
|
◆结果:在模拟器上出现了装满数据的Listview控件,可见里面的数据的解析出来了。
JSON字符串的网络获取与解析对我们来说很重要,也是一个必须掌握的东西啊。。