之前我自己整的时候,从网上扒了各种资料,发现还是挺杂乱的(目前比较菜,只会用百度。。。),于是我整了一下这条主线,比较垂直,但是可以直接用。
长篇励志好文
(算是第一篇标原创的)
↓↓↓
引言:前端发出数据后,如果后端你想要用@RequestBody来解析成对象,那么你先要确定你发过来的数据是一个"json字符串",而不是表单数据或者对象啥的。
如下图区别:
此处为表单数据
此处为正统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;
上大图解析
解析:
如图所示,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可以各种啪啪啪
的敲代码了
关于我为啥不用好看的样式。。。
表示太费时间了,目前承担不起。。。