调用第三方接口,返回一堆json,我只想取得里面的某一个属性,但是返回的比较复杂,无法直接拿到属性,格式类似于这样:
{"video":{"id":"29BA6ACE7A9427489C33DC5901307461","title":"体验课01","desp":"","tags":" ","duration":503,"category":"07AD1E11DBE6FDFC","image":"http://2.img.bokecc.com/comimage/0DD1F081022C163E/2016-03-09/29BA6ACE7A9427489C33DC5901307461-0.jpg","imageindex":0,"image-alternate":[{"index":0,"url":"http://2.img.bokecc.com/comimage/0DD1F081022C163E/2016-03-09/29BA6ACE7A9427489C33DC5901307461-0/0.jpg"},{"index":1,"url":"http://2.img.bokecc.com/comimage/0DD1F081022C163E/2016-03-09/29BA6ACE7A9427489C33DC5901307461-0/1.jpg"},{"index":2,"url":"http://2.img.bokecc.com/comimage/0DD1F081022C163E/2016-03-09/29BA6ACE7A9427489C33DC5901307461-0/2.jpg"},{"index":3,"url":"http://2.img.bokecc.com/comimage/0DD1F081022C163E/2016-03-09/29BA6ACE7A9427489C33DC5901307461-0/3.jpg"}]}}
其实我想获得“duration”这个属性,在网上搜索如何解析复杂json,五花八门,用什么技术的都有,但是都只用一种技术,依我看,几种技术组合起来用才是效率最高
这里的jsonObject用的是net.sf.json.JSONObject,jar包为json-lib-2.2.2-jdk13.jar;Gson所用到的jar包为gson-2.3.1.jar,其中json-lib-2.2.2-jdk13.jar不能单独使用,必须配合其他jar
下面代码为JSONObject与Gson的组合使用获取“duration”属性,将服务器返回的json作为参数传入即可
//解析json数据
public static int parseJson(String str){
JSONObject jObj = JSONObject.fromObject(str);
Object obj=jObj.getJSONObject("video");
String s2=obj.toString();
Gson gson=new Gson();
Map map=gson.fromJson(s2, Map.class);
Number num=(Number)map.get("duration");
return num.intValue();
}
如果你想解析json里面的嵌套json数组,解决方法可参考这篇博客(http://blog.csdn.net/lhfeng/article/details/7398880)
在这里还有一个问题要提一下,由于duration属性是double类型的,取出来数值是503.0,我不想带小数点,所以我直接在下划线部分这样写
Integer num=(Integer)map.get("duration");
结果报错了,报java.lang.Double cannot be cast to java.lang.Integer ,Integer属于不可更改类型,而且Double和Integer没有任何继承关系,当然不能这样转换。
注:java.lang.Number是Integer,Double的父类,所以要写成样 Number num=(Number)map.get("duration");最后再num.intValue()就可以去掉小数点了
这个错误可参考这篇博客(http://blog.sina.com.cn/s/blog_794d4bfd0102uz4i.html)