我们知道,手机上信息的显示与更新,均来自于网络中的服务器等。而像新浪这样对外开放接口,我们根据接口的规范等获得我们想要的数据,这时就需要我们运用网络通信的知识,去获得他返回给我们的字串,我们往往得到的是想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控件,可见里面的数据的解析出来了。![未命名.bmp 082145273.jpg](https://i-blog.csdnimg.cn/blog_migrate/07b7baa5ebbd50978014d424e81474e6.jpeg)
JSON字符串的网络获取与解析对我们来说很重要,也是一个必须掌握的东西啊。。加油吧。。![j_0015.gif](https://i-blog.csdnimg.cn/blog_migrate/72ff99c9ea500e990b96a2de9610edd0.gif)
转载于:https://blog.51cto.com/cinderella7/1292283