0%

【SpringMVC】JSON讲解

前端、后端如何使用JSON进行交互

一、认识JSON

1.1 JSON介绍

  • JSON为一个字符串,是前后端分离的重要工具
  • 前后端都可以正确解析JSON,所有前后端交流可以通过JSON来实现

1.2 前端对JSON的操作

  • 解析JSON:JSON.parse(JSON json)方法
  • 封装JSON:JSON.stringify(Object object)方法
  • 创建一个html来演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>

<script type="text/javascript">
//1、编写一个JavaScript对象 ES6
var user = {
name : "莱特雷",
age : 3,
sex : "男"
}

console.log(user); //输出user对象
console.log("============================");

//2、将js对象转换成json对象
var json = JSON.stringify(user);

console.log(json); //输出json字符串
console.log("============================");

//3、将JSON对象转化为javascript对象
var object = JSON.parse(json);

console.log(object);
</script>

</head>
<body>

</body>
</html>
  • 控制台打印结果

二、Jackson使用

2.1 导入第三方jar包

2.2 后端发送JSON步骤

  • (1)在controller接口实现类,在请求映射方法添加新注解@ResponseBody,让方法不会被视图解析器识别
  • (2)或者直接在来上添加@RestController来使类中所有方法都不会被视图解析器识别
  • (3)方法中创建一个ObjectMapper对象,通过writeValueAsString()方法转变成JSON字符串
  • (4)return JSON字符串来对前端发送数据
1
2
3
4
5
6
7
8
9
10
11
12
13
@RequestMapping("/j2")
@ResponseBody //此注解,让此方法不会走视图解析器,会直接返回一个字符串
public String json2() throws JsonProcessingException {

User user = new User("莱特雷", 21, "男");

//使用Jackson,编程JSON字符串
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(user);//把user变成一个字符串

return str;
//页面结果:{"name":"???","age":21,"sex":"?"}, 出现乱码
}

2.3 乱码解决

  • (1)原生态解决方法
    • 在请求映射注解添加额外参数produce
1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value = "/j3", produces = "application/json;charset=utf-8")
@ResponseBody
public String json3() throws JsonProcessingException {

User user = new User("莱特雷", 21, "男");

ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(user);

return str;
}
  • (2)在spring配置文件中进行设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--解决后端向前端传递数据乱码问题-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><!--注意:是json.Mappxxxxxx,不是cbor.Mappxxxxxxx,别导错包-->
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

2.4 返回多个对象的JSON

  • 方法没变,Jackson的writeValueAsString()支持集合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//返回多个对象的JSON
@RequestMapping("/j4")
@ResponseBody //此注解,让此方法不会走视图解析器,会直接返回一个字符串
public String json4() throws JsonProcessingException {

User user1 = new User("莱特雷", 21, "男");
User user2 = new User("C酱", 18, "女");
User user3 = new User("咕料", 30, "男");
User user4 = new User("YJJ", 25, "男");

List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);

ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(list);

return str;
//页面结果:[{"name":"莱特雷","age":21,"sex":"男"},{"name":"C酱","age":18,"sex":"女"},{"name":"咕料","age":30,"sex":"男"},{"name":"YJJ","age":25,"sex":"男"}]
}

2.5 返回时间

  • (1)使用SimpleDateFormat来对时间戳进行格式化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RequestMapping("/j5")
@ResponseBody //此注解,让此方法不会走视图解析器,会直接返回一个字符串
public String json5() throws JsonProcessingException {

Date date = new Date();//时间戳

//格式化时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
String format = sdf.format(date);

ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(format);

return str;
//页面结果:"2020-10-25 04:10:11"
}
  • (2)利用ObjectMapper来格式化时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RequestMapping("/j6")
@ResponseBody
public String json6() throws JsonProcessingException {

ObjectMapper mapper = new ObjectMapper();
//不使用时间戳
ObjectMapper configure = mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

//自定义日期的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
mapper.setDateFormat(sdf);//设置获取时间的格式

//按格式获取时间(不再获取时间戳)
Date date = new Date();

String str = mapper.writeValueAsString(date);

return str;
//页面结果:"2020-10-25 16:10:08"
}

三、FastJson使用

  • fastjson是阿里开发的一款专门用于Java开发的包

3.1 导入第三方jar包

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>

3.2 fastjson三个主要类

  • (1)JSONObject:代表Json对象
  • (2)JSONArray:代表json对象数组
  • (3)JSON:JSONObject和JSONArray转化

3.3 常用方法(静态方法)

  • (1)Java对象 转变成 JSON字符串
    • JSON.toJSONString(Object object)
  • (2)JSON字符串 转变成 Java对象
    • JSON.parseObject(String json)
  • (3)Java对象 转变成 JSON对象
    • JSON.toJSON(Object object)
  • (4)JSON对象 转变成 Java对象
    • JSON.toJavaObject(JSON json, Class<T> clazz)
      • 参数一:JSON对象,参数二:要转化成的Java对象