json对象json中对象包括在一对大括号里面,对象中的每一个item都是一个key:value数据对,数据对之间以逗号来分隔。json对象的key只能是string类型,value可能是其它类型如number,boolean,null。如下所示
{ name : alex, sex : male, age : 20,}
json数组json数组包括在一对中括号里面,每一个元素都是一个json对象,也是以逗号来分隔,示例如下
[ { name : alex, sex : male, age : 20, }, { name : may, sex : female, age : 19, }, { name : mike, sex : male, age : 21, }]
fastjson的基本用法fastjson是alibaba公司开发出来的专门解析json的一个框架,根据他们自己的测试,速度非常快,效率非常高,而且没有之一。我们以从聚合数据网站上查询苏州城市天气预报的一个json数据为例来说明,获取的url地址是http://v.juhe.cn/weather/index?format=2&cityname=%e8%8b%8f%e5%b7%9e&key=6f9276e4d79c5d102bbfb28717beba93。为确保数据源没有问题,可以在浏览器中打开url,看看是否有数据。这里再介绍一款mac下的工具json accelerator,不但可以从网络上抓取,还可以添加http请求头信息,使用起来非常方便。
创建工程新建工程取名为fastjsondemo,由于要访问网络,所以需要在androidmanifest.xml中添加相应权限
代码部分网络请求部分,这里我们使用volley这个库,google出品,使用简单。源码下载地址https://android.googlesource.com/platform/frameworks/volley/,jar包的下载地址http://download.csdn.net/detail/djstava/8793421。下载后把volley的库导入到工程中,ui的话,用了一个textview来显示接收到的json数据
为了建立一个全局的请求队列,需要在实现一个继承自application的子类,叫volleyapplication
package com.djstava.fastjsondemo;import android.app.application;import com.android.volley.requestqueue;import com.android.volley.toolbox.volley;/*** 包名称: com.djstava.fastjsondemo* 创建人: djstava* 创建时间: 15/9/23 下午3:44*/public class volleyapplication extends application{ public static requestqueue requestqueue; @override public void oncreate() { super.oncreate(); requestqueue = volley.newrequestqueue(getapplicationcontext());}public static requestqueue getvolleyqueue() { return requestqueue; }}
然后在mainactivity中的onstart方法编写请求部分,然后在onstop方法中取消请求
private static final string json_url = http://v.juhe.cn/weather/index?format=2&cityname=%e8%8b%8f%e5%b7%9e&key=6f9276e4d79c5d102bbfb28717beba93;//字段key是从聚合数据网站上申请过来的,请自行替换@overrideprotected void onstart() { super.onstart(); jsonobjectrequest jsonobjectrequest = new jsonobjectrequest(request.method.get, json_url, null, new response.listener() { @override public void onresponse(jsonobject jsonobject) { try { textview.settext(jsonobject.tostring()); log.e(tag,result: + jsonobject.getstring(resultcode)); } catch (jsonexception e) { e.printstacktrace(); } } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror volleyerror) { log.e(tag, volleyerror.getmessage()); } }); jsonobjectrequest.settag(fastjson); volleyapplication.requestqueue.add(jsonobjectrequest);}@overrideprotected void onstop() { super.onstop(); volleyapplication.requestqueue.cancelall(fastjson);}
别忘了在androimanifest.xml文件application标签中加入
android:name=.volleyapplication
使用genymotion模拟器运行程序,可以看到获取的数据
为了方便读者查看,利用json accelerator格式化一下
{result : {sk : { humidity : 58%, wind_direction : 西北风, temp : 26, wind_strength : 2级, time : 17:27},today : { temperature : 22℃~27℃, dressing_index : 舒适, dressing_advice : 建议着长袖t恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。, uv_index : 弱, comfort_index : , wind : 东北风3-4 级, weather : 多云转阵雨, city : 苏州, date_y : 2015年09月24日, week : 星期四, wash_index : 不宜, weather_id : { fa : 01, fb : 03 }, travel_index : 较适宜, exercise_index : 较适宜, drying_index : },future : [ { temperature : 22℃~27℃, weather_id : { fa : 01, fb : 03 }, wind : 东北风3-4 级, week : 星期四, date : 20150924, weather : 多云转阵雨 }, { temperature : 21℃~26℃, weather_id : { fa : 03, fb : 01 }, wind : 东北风3-4 级, week : 星期五, date : 20150925, weather : 阵雨转多云 }, { temperature : 21℃~27℃, weather_id : { fa : 01, fb : 01 }, wind : 东北风3-4 级, week : 星期六, date : 20150926, weather : 多云 }, { temperature : 21℃~28℃, weather_id : { fa : 00, fb : 00 }, wind : 东北风3-4 级, week : 星期日, date : 20150927, weather : 晴 }, { temperature : 22℃~28℃, weather_id : { fa : 01, fb : 01 }, wind : 东风3-4 级, week : 星期一, date : 20150928, weather : 多云 }, { temperature : 22℃~28℃, weather_id : { fa : 01, fb : 03 }, wind : 东风3-4 级, week : 星期二, date : 20150929, weather : 多云转阵雨 }, { temperature : 20℃~25℃, weather_id : { fa : 04, fb : 04 }, wind : 东南风4-5 级, week : 星期三, date : 20150930, weather : 雷阵雨 } ] }, resultcode : 200, reason : successed!, error_code : 0}
接下来该轮到fastjson登场了,,先到http://repo1.maven.org/maven2/com/alibaba/fastjson/下载对应版本的jar包,或者到https://github.com/alibaba/fastjson下载源码,再导入到工程中。
jsonobjectrequest jsonobjectrequest = new jsonobjectrequest(request.method.get, json_url, null, new response.listener() { @override public void onresponse(jsonobject jsonobject) { try { textview.settext(jsonobject.tostring()); com.alibaba.fastjson.jsonobject jsonobject1 = json.parseobject(jsonobject.tostring()); for (map.entry entry : jsonobject1.entryset()) { system.out.println(entry.getkey() + : + entry.getvalue()); } } catch (exception e) { e.printstacktrace(); } } }, new response.errorlistener() { @override public void onerrorresponse(volleyerror volleyerror) { log.e(tag, volleyerror.getmessage()); } });
这样,简单的数据解析就完成了。
何为javabean?javabean是符合某种规范的java组件,也就是java类,它必须满足如下特性:
有一个无参数的默认构造函数有get和set方法我们把公司员工抽象成一个类,然后利用fastjson来解析
package com.djstava.fastjsondemo;/** * 包名称: com.djstava.fastjsondemo * 创建人: djstava * 创建时间: 15/9/28 上午11:07 */public class employee { private int num; private string name; private int age; public employee(int num, string name, int age) { this.num = num; this.name = name; this.age = age; } public void setnum(int num) { this.num = num; } public void setname(string name) { this.name = name; } public void setage(int age) { this.age = age; } public int getnum() { return num; } public string getname() { return name; } public int getage() { return age; } @override public string tostring() { return employee{ + num= + num + , name=' + name + '\'' + , age= + age + '}'; }}
在android studio中,可以自动生成get、set、tostring这些方法,code->generate,快捷键是command + n。
employee employee = new employee(1,djstava,20);log.e(tag,json.tojsonstring(employee));
可以看出输出的json格式与我们类中定义的属性的顺序不一致,其实没有关系,json都是通过key去获取其对应的value的。
如果仅仅是想解析javabean类中某几个字段时,可以使用simplepropertyprefilter这个类来实现,将需要解析的字段添加进来,如将employee类中的num和name解析出来
simplepropertyprefilter simplepropertyprefilter = new simplepropertyprefilter(employee.class,num,name);log.e(tag,json.tojsonstring(employee,simplepropertyprefilter));
源码下载http://download.csdn.net/detail/djstavav/9144789
参考文献1、http://www.json.org/2、https://github.com/alibaba/fastjson/wiki3、https://www.juhe.cn/docs/api/id/39
http://www.bkjia.com/phpjc/1077809.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1077809.htmltecharticleandroid json数据解析 软硬件环境 macbook pro mgx 72 android studio 1.3.2 genymotion模拟器 前言 如今的app很少有不跟服务器打交道的,其中在轻量级的通...