Java web json解析交互详解

这段时间学习json交互,懂得了不少东西,其中碰到不少问题,最后都一一解决了。今天下班恰好有时间,总结一篇关于Java web中利用json进行前后台交互的文章,把自己的总结和近日在网上搜到的资料一一奉上。

一JSON简介及用途

Json是继XML后另一种流行的交互格式,json只是一个数据格式,而且结构非常简单,如今流行程度已经超过XML,成为最普遍的交互格式。

我自己通俗理解,如果一个场景具备以下三点,就应该使用json作为交互格式1、数据量较小 2、端与端之间的交互  3、结构化数据。首先数据量越大,json的解析逻辑也复杂起来,这时就不适用;然后是端与端,比如server与安卓客户端、server与浏览器间通信;最后是结构化,就是简单的数据,比如数值,布尔值,字符串。连起来就是端与端,进行小量简单数据交换,就用json。其实传大量数据或图片语音的交互能占多少呢,大部分就是这种小数据交互,比如聊天工具,产生绝大部分的内容都是小段文本。

我是从IBM网站的介绍初步认识json的,讲的恨透彻。IBM JSON入门指南,还有json的官网介绍 http://www.json.org/json-zh.html,两篇文章把JSON的数据结构和“JSON”是什么讲的很清楚,个人更喜欢IBM那篇,因为它还介绍了怎么实现(Java对象转为json字符串)。

------------------------------------------分割线:强烈建议看懂以上两篇文章再往下-----------------------------

二实际应用

下面是js与Java后台交互实例代码,客户端与服务器之间的交互我没学习过。分为四部分:JS接收JSON;JS发送JSON;后台接收;后台发送。
为了展示方便,先构造一个json对象
{"name":"xcj","age":22}       
{name:"xcj",age:22}  //不严格的写法

一:前台接收

JS接收到JSON对象或是JSON字符串,有多个处理方法。首先JSON结构是需要事先知道的,如果不知道这个JSON是一个名称和一个年龄,那么很难解析。因为JSON本来就是为js为设计的,所以js处理json非常简单。
var person={"name":"xcj","age":22}      //直接定义person引用json
person.name="xcj2"				//修改内容
如果接受到一个JSON字符串。则使用eval方法解析为json对象,直接引用就行
var person=eval("("+jsonString+")");     //jsonString为接收到的字串
这样也能达到目的,因为json刚开始就是为javascript所设计的,所以js处理json实在方便

二:前端发送json

前端页面产生数据时,一般是js对象,需要转为json格式发送到后台。假设一个js对象如下
var person={};
person.name="xcj";
person.age=22;
 
       该js等同上面的json。现在将该js转换为json字符串,传到Java后台,js转成json需要使用json2.js(也有很多其他js插件、Ajax框架可以做到,这里使用json官方的json2.js)。注意不是json.js,那是旧版,而且搜索出来的资源少。当时我浪费了很多时间,后来搜json2.js马上ok。 
  
   引入json2.js后,有两种方法可以将js转为json字串。
//1、JSON.stringify()      
var  jsonString=JSON.stringify(person);
//2、toJSONString()方法。
var jsonString=person.toJSONString();
 /*然后将字符串传到后台即可。json2.js还提供了JSON.parse()方法和parseJSON,用于将json字符串转换为js对象*/
//1、JSON.parse()
var person=JSON.parse(personstr);
//2、parseJSON
var person=personstr.parseJSON();

疑问与理解要点:

1、JSON.stringify是json.js就有的方法,而toJSONString是新版本中的方法,将方法注入到javascript内建对象,如果引入的是json.js调用此方法会报错。
2、任意js对象都可以调用toJSONString,而引用parseJSON的必须是字符串。
3、js对象的几种表示方式。
/*传统通过Object*/
var obj1=new Object();
obj1.age=22;

//传统通过构造函数
function person(name,age){
this.name=name;
this.age=age;
}
var obj2=new person(myname,myage);
//从javascript1.2开始,可以通过json语法构造,这种简单很多
var person={name:myname,age:myage}

//数组传统构造如下
var pa=new Array();
pa[0]=new person('xcj',22);
pa[1]=new person('sicong',23);
//引入json语法后新构造如下
var pa=[{name:'xcj',age:22},{name:'sicong',age:23}]

4、 JSON的key加不加双引号的问题:这是严肃的问题,但我不严肃地看待它。json的key加不加双引号其实都是对的,但标准时要加的,如果是在php、java后台这样的地方,构建json时key不加引号会被当成变量。而且第三方工具也可能报错,比如jQuery的parseJSON方法就要求json字符串的key一定要双引,才能转换为js对象。
      总之构造字符串时key一定要引上,在写js对象时加不加都行,反正转换为json字符串都会自动带上引号。不管怎么说,加上是最好的。

三、java后台接收

    java本身并不认识json这种东西,需要借助第三方包,引入org.json包。该包主要的三个类JSONArray、JSONException、JSONObject。分别用于代表json数组,处理json产生的错误,以及JSON对象(非数组)。
   首先我们某个遥远的地方接收到一个字符串jsonstr,java知道是json,但是看不懂,于是叫来专家处理,过程是这样的。。
   假设该json串是一个数组,包括两个人xcj和sicong。jsonstr='[{"name":"xcj","age":22},{"name":"sicong","age":25}]'
JSONArray jsonarr=new JSONArray(jsonstr);//转换为json数组
for(int i=0;i< jsonarr.length();i++){
   //输出数组第i个json对象,key为name的值
     System.out.print(jsonarr.getJSONObject(i).get("name"));
   System.out.print(jsonarr.getJSONObject(i).get("age"));
}
结果(空格为手添):
xcj  22         sicong             25
这样就获取json的内容,也可以转换成java对象,再进行处理。

四、java生成json字符串发送

//1、集合转为数组,数组再转为字符串
JSONArray array = JSONArray.fromObject(personlist);
String jsonstr = array.toString();

//2.java对象转为json对象,再转为字符串
JSONObject object = JSONObject.fromObject(person1);
String jsonstr=object.toString();
 
   

注意:json相关的代码要用try-catch包裹,并用JSONException捕捉处理。
  解析json要先知道结构,比如是不是数组。(结构未知,解析工作量很大,特别是复杂的json串。这时不适合用json)。
现在json相关的工具包和方法很多,我只写了最简单的用法,复杂的json我还不知道怎么处理,应该大同小异吧。
--木木是广州工作的java程序员,欢迎添加我的微信abc519764500互相交流,广州的朋友可以周末一起去活动休闲哦。


你可能感兴趣的:(前端开发,JAVA,WEB,java,web,json,java解析json,json)