【问题-java-json】josn的发送与接收(全)解析json对象与字符串在js中的区别,以及后端spring该如何接收?

之前我自己整的时候,从网上扒了各种资料,发现还是挺杂乱的(目前比较菜,只会用百度。。。),于是我整了一下这条主线,比较垂直,但是可以直接用。


长篇励志好文

(算是第一篇标原创的)

↓↓


引言:前端发出数据后,如果后端你想要用@RequestBody来解析成对象,那么你先要确定你发过来的数据是一个"json字符串",而不是表单数据或者对象啥的。


如下图区别:

【问题-java-json】josn的发送与接收(全)解析json对象与字符串在js中的区别,以及后端spring该如何接收?_第1张图片

此处为表单数据


【问题-java-json】josn的发送与接收(全)解析json对象与字符串在js中的区别,以及后端spring该如何接收?_第2张图片

此处为正统json字符串


用控制台看,明显颜色都不一样。

下面来解释一下该原理。


一、前端部分


前端代码示例:

//声明json对象

var param = new Object();

param.zain = "zain";

param.code = "java";

param.love = "code";

var data = "这是一个json字符串";

var _param = {"param":param,"data":data};


//发送ajax请求

$.ajax({    //方法头

    type: "post",    //请求方式,get方式也可

    url: "http://www.zain.com/json/json.action",    //请求地址

    data:JSON.stringify(_param),   //要发送的数据的json字符串

    dataType: "json",    //数据类型为json

    contentType:"application/json", //连接格式为json

    success: function(data){    //data为后台传回来的数据

        //执行成功之后的方法

    },

    error: function() {

        //执行失败之后的方法

    }

});


流程解析:

1.首先是我在js中声明了一个对象,之后向这个对象中塞入各种属性,形成param,data是随便写的一个字符串。

2.之后通过json组合,将param和data都塞进了json对象中形成_param,最后在data中转换发送数据格式,JSON.stringify为将json对象转换为json字符串。

3.连接格式修改成application/json它,不使用默认的application/x-www-form-urlencoded 。

4.这样就愉快的发了一串json字符串过去,同时@RequestBody这个注解也可以解析他了。解析形式也是通过自己声明的javabean(实体类)来解析。


前端json解析:

1.关于如何直接声明json对象与json字符串:

JSON对象:

var jsonObj = { "name": "cxh", "sex": "man" };

JSON字符串:

var jsonStr = '{ "name": "cxh", "sex": "man" }';

其中的区别起始就是两边有木有引号...我目前还是喜欢先对象后转串,大家可以尝试直接json字符串试试,看往里塞东西时,有木有啥限制。

注:json除了对象格式外,其实还有个数据格式,此处不做解析,以后会补充滴。不得不说数组模式也蛮常用的,做前端的话,会经常看到很多.json格式的文件,其中传输的就是josn数组或数组格式的字符串。


2.js里关于json对象与字符串的转换函数

//将JSON字符串转换为JSON对象

var jsonObj1 = jsonStr.parseJSON();

var jsonObj2 = JSON.parse(jsonStr);

//将JSON对象转化为JSON字符串

var jsonStr1=jsonObj.toJSONString();

var jsonStr2=JSON.stringify(jsonObj);



二、后端部分


当你愉快如例图所示,发送过来一个json字符串之后,并且你还使用了java对象来接收,没有报错,那么恭喜你,已经成功了第一步,对于简单的json字符串格式已经可以随便拿来用来。


but


如果你也像我一样作死,接收这种复杂格式的json字符串的话,就有活干了!因为对于json内部的之前我塞的json对象而言,无法完美兼容java对象,即无法使用直接转换或强转,需要进一步处理。


当然方法很多啦,我找到了一个歪招,还挺好用的。


我在调试的时候发现老是报HashMap不能转为java对象的错,于是我用Obj强转之后toString了以下发现,里面存的是个Map格式的字符串。。。于是我打开了百度,搜索 String转Map,然后发现了奇迹。。。


神奇方法:

JSONObject  jasonObject = JSONObject.fromObject(str);

Map map = (Map)jasonObject;


上大图解析

【问题-java-json】josn的发送与接收(全)解析json对象与字符串在js中的区别,以及后端spring该如何接收?_第3张图片


解析:

如图所示,jsonObj是可以直接强转为Map的,所以此处可以直接暴力强转,虽然说接收的玩意是个对象,但是里面存的是json字符串,变相的解析了其中的字符串。


其他格式暴力转类同:

1. List

JSONArray jsonArray = JSONArray.fromObject( list );

2. Map

JSONObject jsonObj = JSONObject.fromObject(map);

3. Bean

JSONObject jsonObj = JSONObject.fromObject(new JsonBean());

4. 数组

JSONArray jsonArray = JSONArray.fromObject(myArray);

5. 字符串

JSONArray jsonArray = JSONArray.fromObject("['zain','is','good']" );



- 完美结束 -


以后有了json可以各种啪啪啪

的敲代码了



关于我为啥不用好看的样式。。。

表示太费时间了,目前承担不起。。。

【问题-java-json】josn的发送与接收(全)解析json对象与字符串在js中的区别,以及后端spring该如何接收?_第4张图片


你可能感兴趣的:(技术交流,json,spring,java)