区别?
js
- 如果是字符串,就是有双引号。只不过字符串内容是json格式的字符串,但是本质仍然是字符串。和其他字符串的区别,主要是json格式字符串有一定的格式,方便被转换为json对象。这也是json格式字符串的主要作用,就是为了方便和json对象互相转换。
- 如果是json对象,其实就是一个js对象,json对象也是js对象的一种。语法区别就是,json对象是没有双引号的,并且,可以用.访问json对象的字段。
java
- 如果是字符串,就是有双引号。这个和上面js介绍的基本上一样。
- 如果是json对象,其实就是一个java对象,本质是一个自定义对象(比如,阿里fastjson的JSONObject)。比如,我们最常用的应用场景是,打印日志的时候用阿里fastjson来打印对象数据。主要作用其实也是方便json格式字符串和对象转换。
总结
- json格式字符串
是为了方便通信,即前端和后台代码,通信的数据格式一般情况都是字符串。有的情况是需要json格式的字符串更方便,主要是为了把json格式字符串转换为json对象,所以就有了json格式的字符串。
- json对象
json对象的目的是为了方便获取对象的字段,不管是js json对象,还是java里的json对象(比如fastjson的JSONObject)。
- 最终的本质,其实就是两个关键字
1)通信
前后端通信是用字符串,而用json格式字符串的目的是方便转换为json对象——json对象的目的又是为了方便读对象的字段。
2)方便读数据
json对象的目的是为了方便获取对象的字段。
应用场景
jquery post,需要注意以下几个点。
是异步请求
为什么是异步请求?
就是请求之后,无需等待服务器返回数据,js继续往后执行。
那异步请求怎么获取数据?
通过回调方法。
本质和ajax一样,只不过ajax多了一个入参-请求类型(get/post)
jquery post,只是更加简化了jquery ajax的写法,相当于约定大于配置。
js的代码没有智能提示,根本不知道哪个方法传哪个入参。
入参和入参类型
- 入参
大部分时候都是json对象,即{key1:value1, key2:value2}。
- 入参类型
后面还会根据入参类型,再转换一下,然后才发送到服务器。
contentType:发送POST请求的格式,默认值为
'application/x-www-form-urlencoded; charset=UTF-8' //这个表示是以键值对的形式提交表单数据,然后发送到服务器,一般都是用这个默认的,后端控制器有对象接收各个字段的值
,也可以指定为
text/plain
、
application/json //这个表示以json格式字符串的形式发送到后端,如果是这种情况,后端控制器入参就要标明是json格式字符串,然后才好把前端传过来的json格式字符串转换为对象。
;
出参和出参类型
- 出参
回调方法的入参,就是服务器的返回数据(即出参)。
- 出参格式
dataType:接收的数据格式,可以指定为
'html'
、
'xml'
、
'json' //一般都是用json,所以做好显式的写json
、
'text'
等,缺省情况下根据响应的
Content-Type
猜测。
最佳实践:一般都是用json,所以做好显式的写json,这样就不需要手动去再把json格式字符串转换为json对象了。
实际例子:下面截图就是因为显式写了json,出参的json格式字符串就自动转换为json对象了
如果没有显式写json,就要手动转换一下。有下面几种方法:
1、Javascript支持的转换方式:
eval(’(’ + jsonstr + ‘)’); //可以将json字符串转换成json对象,注意需要在json字符外包裹一对小括号
注:ie8(兼容模式),ie7和ie6也可以使用eval()将字符串转为JSON对象,但不推荐这些方式,这种方式不安全eval会执行json串中的表达式。
2、JSON官方的转换方式:
JSON.parse(jsonstr); //可以将json字符串转换成json对象
JSON.stringify(jsonobj); //可以将json对象转换成json对符串
3、jQuery插件支持的转换方式:
示例:
$.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象
后端java代码,如何返回json格式字符串给前端?
用servlet原生的api-HttpServletResponse
- 用fastjson先把对象转换为json格式字符串
super.responseMessage(response, JSONObject.toJSONString(对象));
- 写数据到前端的浏览器
protected void responseMessage(HttpServletResponse response, String message//json格式字符串)
throws IOException {
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.write(message);
}
用spring注解
本质和上面的方法一样,只不过注解帮你把对象转换为json格式字符串的工作给偷偷的做了。
参考
www.liaoxuefeng.com/wiki/102291…
www.liaoxuefeng.com/wiki/102291…
HTTP content-type www.runoob.com/http/http-c…