1.什么是JSON?
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
-
采用完全独立于编程语言的文本格式来存储和表示数据。
-
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
-
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式: -
对象表示为键值对,数据由逗号分隔
-
花括号保存对象
-
方括号保存数组
//json字符串
{
"empno": 12,
"ename": "yishun",
"hiredate": "2023-12-02",
"dept": {
"deptno": 22,
"dname": "研发部",
"loc": "郑州市"
}
}
//json数组
[
{
"empno": 1,
"ename": "yishun1",
"hiredate": "2023-12-02",
"dept": {
"deptno": 12,
"dname": "财务部",
"loc": "商丘市"
}
},
{
"empno": 2,
"ename": "yishun2",
"hiredate": "2025-12-02",
"dept": {
"deptno": 22,
"dname": "研发部",
"loc": "郑州市"
}
}
]
2.SpringMVC中Controller接收JSON数据
在前后端分离的架构之中,最为常见的数据交互格式一定使用的是JSON,用户在前端应用里面所提交的表单内容会自动拼凑为对应的JSON数据,并利用一个远程组件Axios发送给服务端,一般来讲此处的操作都是属于跨域访问的形式。如果前端发送的数据是JSON,那么就需要将这个JSON的数据转为对象的实例,那么这时候在控制层参数接收的时候就不能在简单的声明一个对象了,这个对象上需要使用到@RequestBody的注解定义。
如果要想实现此类的架构,首先就是进行JSON数据的解析
FastJSON组件(阿里开源),这个组件不是Spring推荐的组件,Spring推荐使用Jackson组件库
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.1</version>
</dependency>
如果要想使用Jackson组件,需要进行额外的配置处理,因为配置要转换的数据格式
配置Jackson组件
@Configuration
public class JacksonConfig {//JSON的配置类
@Bean//进行请求映射的处理
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
MappingJackson2XmlHttpMessageConverter converter =
new MappingJackson2XmlHttpMessageConverter();
converter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_JSON));//MIME类型
adapter.setMessageConverters(List.of(converter));//添加转换器
return adapter;
}
}
测试
@PostMapping("add")
@ResponseBody
public String add(@RequestBody Emp emp) {
//该数据要经过Jackson组件的转换才能使用
//Jackson组件自动把json数据解析为对象封装
LOGGER.info("【雇员信息】编号:{}、姓名:{}、雇佣日期:{}、部门编号:{}、部门名称:{}、部门位置:{}",
emp.getEmpno(), emp.getEname(), emp.getHiredate(), emp.getDept().getDeptno(), emp.getDept().getDname(), emp.getDept().getLoc());
return "success";//只关注后台的输出
}
@PostMapping("array")
@ResponseBody
public String array(@RequestBody List<Emp> empList) {
//该数据要经过Jackson组件的转换才能使用
for (Emp emp : empList) {
LOGGER.info("【雇员信息】编号:{}、姓名:{}、雇佣日期:{}、部门编号:{}、部门名称:{}、部门位置:{}",
emp.getEmpno(), emp.getEname(), emp.getHiredate(), emp.getDept().getDeptno(), emp.getDept().getDname(), emp.getDept().getLoc());
}
return "success";//只关注后台的输出
}
测试add()
测试array()
3.解决JSON返回数据中文乱码
此时把add()方法返回的json信息设置为了中文
@PostMapping("add")
@ResponseBody
public String add(@RequestBody Emp emp) {
//该数据要经过Jackson组件的转换才能使用
LOGGER.info("【雇员信息】编号:{}、姓名:{}、雇佣日期:{}、部门编号:{}、部门名称:{}、部门位置:{}",
emp.getEmpno(), emp.getEname(), emp.getHiredate(), emp.getDept().getDeptno(), emp.getDept().getDname(), emp.getDept().getLoc());
return "成功";//只关注后台的输出
}
Postman测试响应中文乱码
此时在我们的Web配置类中复写以下方法
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> converter : converters) {
// 解决 Controller 返回普通文本中文乱码问题
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
}
// 解决 Controller 返回json对象中文乱码问题
if (converter instanceof MappingJackson2HttpMessageConverter) {
((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
}
}
}
测试
成功解决中文乱码