最近在做关于微薄项目的开发,瞬间发现JSON这种强大的数据传输格式。JSON(javaScript Object Notion)是,目前较为流行的数据传输格式,相对于XML,JSON的优点可谓多多,第一:在大小上,所占的空间小;第二:在传输解析上,xml的解析通常需要ASP解析器进行解析,但是json一般只需要导入相应的包进行解析即可,第三:书写上比XML来的简单易懂,对象的创建类似于简单化的Java类的创建。总而言之,简单易用。但是今天我们要讲的是,它在不同端的使用的具体区别。
先讲web客户端的使用,当服务器端传来一段json格式的字符串后,我们可以采取两种方式进行解析:
1)第一种:使用javaScript自带的eval()函数进行解析
var jsonObj2=eval("("+strObj2+")");
其中:需要注意的考虑到安全性问题,我们一般不建议使用eval()进行解析json格式的字符串
2)第二种:使用json.js文件进行解析。下载地址:json.js
将json字符串解析成JSONObject的对象的常用的方法是JSON.parse(str);其中str是json格式的字符串文本
var strObj='{"name":"srtzzjmay"}';
var jsonObj=JSON.parse(strObj);
alert(jsonObj);
alert(jsonObj.name);
同时该工具也提供将json对象转化成json格式的字符串,使用的方法是toJSONString(obj)
alert(jsonObj.toJSONString());
说完web客户端后,当然很多人往往更加关注的是服务器端的使用,因为json字符串的来源莫过于都是服务器传递过来的。
在我们使用服务器端进行json编程时,我们要导入一些JSON专用的包,大家可以去JSON的官网下载对应的包,这里有我整理好的json要用到JAR包整合资源json.jar
服务器端使用JSON要用到两大类,JSONObject和JSONArray
1)JSONObject的使用
常用的方法有:
1.fromObject(object | str):将对象或字符串对象封装成JSONObject
//将Java对象的转化成JSON对象
Person person=new Person("zzjmay", 18,"male");
//fromObject(object)默认复写了toString()的方法
System.out.println(JSONObject.fromObject(person));
//json字符串转化为JSON对象
String string ="{\"age\":20,\"name\":\"zzjmay\",\"sex\":\"female\"}";
String mess="{\"mess\":\"验证码不正确\",\"flag\":false}";
JSONObject jsonObject=JSONObject.fromObject(string);
JSONObject jsonObject2=JSONObject.fromObject(mess);
System.out.println(jsonObject2);
2.put(key,value):用于向JSONObject动态添加一些程序员自己需要的键值对
JSONObject jsonObj=new JSONObject();
jsonObj.put("mesage",Object);//这里的Object可以是对象或者字符串或者集合
3.toBean(JSONObject jsonobj,Class class):作用将JSON对象转化成我们自定义的JavaBean
//将JSON对象转化成我们的java对象
Person person2=(Person) JSONObject.toBean(jsonObject, Person.class);
System.err.println(person2.toString());
4.containKeys(String key):用于判断JSONObject中是否包含某键值
2)JSONArray的使用
常用方法:
1.FromObject(Object obj):这里不再赘述,和JSONObject是一样的用法
最后我们来说Android客户端的JSON编程,相比前面两个端的编程来讲,Android不需要导任何包,因为Android本身的SDK就是就已经帮我们支持了JSON的编程,并有适合Android使用的类:JSONObject和JSONArray。也许读者一开始看到会觉得这和服务器端的不是一样的吗,但是就我看源码而言,还是有很大差别的,在对象方法的使用中既有相同也有不同。那么接下来我就以JSONObject来说说有什么不同。
首先,在Android中JSONObject不存在fromObject()的方法,因此我们要将我们的对象封装成JSONObject,采用的方法使用其提供的构造器
JSONObject jsonObj=new JSONObject(Object);
最后我想分享的是在我Android编程遇到的问题,很多时候在获取JSONObject对象的键时我们一般使用的get(String str)方法,但是会出现一个很严重的问题,就是当键不存在是会抛出JSONException的异常,那么要解决这个问题我们想到的都是先进行判断,那我们还用上面讲的containKeys方法吗?当然不是,Android中有自己的独特的方法,而且还不会抛出异常,当然发现还要靠我仔细阅读了英文帮助文档。
方法是:isNUll(String str):返回True说明不存在该键所对应的值
if (!jsonObject.isNull("thumbnail_pic")) {
// 说明图片不为空
hodler.weibo_content_img = (ImageView) view
.findViewById(R.id.weibo_content_img);
hodler.weibo_content_img.setVisibility(View.VISIBLE);
}