引言
在早期的web页面中,如web1.0时代,比如一个登陆页面需要刷新页面才能重新登陆,不点击登录页面就不知道自己密码输错了.再举个栗子,去百度输入1,再输入2,不用刷新是否下面的页面也会跟着改变,而且页面没有刷新.现在大多树的网站都是局部刷新,不刷新整个页面的情况下,实现页面刷新;
web2.0时代,最重要的一个因素就是Ajax,而其中的传输数据就是Json数据
什么是Json?
JSON(JavaScript Object Notation.JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛.
采用完全独立变成语言的文本格式来存储和表示数据.简介和清晰的层次结构钢使得JSON成为理想的数据交换语言.抑郁人阅读和编写,同时也抑郁机器解析和生成,并有效地提升网络传输效率
这是他的logo
在JS语言中,一切都是对象.因此,任何支持的类型都可以通过JSON来表示,例如字符串,数字,对象,数组等
格式要求
- 对象表示为键值对
- 数据由括号分隔
- 花括号保存对象
- 方括号保存数组
JSON键值对是用来保存JS对象的一种方式.和JS对象的写法也大同小异,键/值对组合中的简明在前面用双引号""包裹,使用冒号:分割然后紧接着值:
{"name":"ChouGouShi"}
{"age":"3"}
{"sex":"男"}
很多人搞不清楚JSON和JS对象的关系,甚至连谁是谁都不清楚.其实,可以这么理解:
JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串.
首先看一下对象和JSON的差异
var obj = {a: 'hello',b: 'shit!'};//这是一个对象,注意简明也是可以使用引号包裹的
var json = '{"a": "hello","b": "shit!"}';//这是一个JSON字符串,本质是一个字符串
JSON和JS对象互相转换(后面有JAVA对象互转,别急)
要实现JSON字符串转换为JS对象,使用JSON.parse()方法:
var obj = JSON.parse('{"a": "hello","b": "shit!"}') //fu
要实现JS对象转换成JSON字符串,使用Json.stringify()方法:
var json = JSON.stringifg({a: 'hello',b: 'shit!'})
对应页面代码,然后在页面f12查看一下吧
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript">
//编写一个对象
var user = {
name:"臭狗屎",
age:2,
sex:"男"
}
console.log(user); //输出这个对象
var str = JSON.stringify(user); //转换成json
console.log(str); //输出转换后的对象
var str1 = JSON.parse(str); //再将转换后的对象转换成对象
console.log(str1) //输出对象
</script>
</body>
</html>
</pre>
Java对象与Json的互相转换
首先我们要知道要实现页面无刷新,从Controller返回的response请求就不能经过视图解析器了,想要实现这个,就要在Controller
类加上一个@ResponseBody
注解这个注解的作用就是返回前端数据的时候不返回真个页面而是一串数据
(记住使用这个注解的时候需要添加对应依赖)
实现Json
市面上有很多第三方的jar包可以实现这个功能,jackson.只需要一个简单的注解就可以实现了
下面是使用方法
/*
* 这里我没有用Springboot,创建的是一个web项目,所以懒得弄web的配置了,代码没问题偶
*/
@Controller
public class Spring {
@RequestMapping("/json1")
@ResponseBody
public String json1() throws JsonProcessingException{ //注意这里将异常抛出了
ObjectMapper mapper = new ObjectMapper(); //jackson下的对象,jackson的对象映射器,就是一个类,使用它可以直接将对象转换成json字符串
//创建一个对象
User user = new User("臭狗屎",22,1234);
System.out.println(user);
String s = mapper.writeValueAsString(user);//转就完事了
System.out.println(s);
return s;
}
}
@Data
@AllArgsConstructor
class User{
private String name;
private int id;
private int tel;
}
重要的地方!简化代码
这里大家别看代码量为何如此庞大,并不简单,简化后的代码如下
@RequestMapping(value="/json2",produces="application/json;charset=utf-8") //这里是为了解决页面中的中文乱按问题
@ResponseBody
public String json2() throws JsonProcessingException{
User user = new User("臭狗屎2号",1,1324); //其实这里也不需要,真正应用的时候会直接传参数过来
return new ObjectMapper().writeValueAsString(user);
}
Json中的集合
@RequestMapping(value="/json3",produces="application/json;charset=utf-8") //这里是为了解决页面中的中文乱按问题
@ResponseBody
public String json3() throws JsonProcessingException{
List userList = new ArrayList();
User user1 = new User("臭狗屎1号",1,1324);
User user2 = new User("臭狗屎2号",1,1324);
User user3 = new User("臭狗屎3号",1,1324);
User user4 = new User("臭狗屎4号",1,1324);
User user5 = new User("臭狗屎5号",1,1324);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
return new ObjectMapper().writeValueAsString(userList);
}
jackson中时间格式化问题(不看后悔)
当我在进行日期格式化的时候出现了这么一个错误
@Test
public void json4() throws JsonProcessingException{
Date date = new Date();
System.out.println(date);
System.out.println( new ObjectMapper().writeValueAsString(date));
}
输出是这样的
Tue Sep 01 19:19:00 CST 2020
1598959140949
不觉得奇怪吗,明明是上面的格式,Json后竟然变成这个吊样
后来官网给了我答案
@Test
public void json5() throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);//就是这句,将时间类型转换成时间戳关闭即可
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //自定义日期格式
mapper.setDateFormat(simpleDateFormat);//让mapper的指定格式为此
Date date = new Date();
System.out.println(date);
System.out.println( new ObjectMapper().writeValueAsString(date));
}