SSM框架如何实现JSON格式数据交互
在Java Web开发中,SSM(Spring + SpringMVC + MyBatis)框架组合因其灵活性和高效性被广泛应用,而JSON(JavaScript Object Notation)作为轻量级的数据交换格式,因其易读易写、跨语言特性,成为前后端数据交互的主流选择,本文将详细介绍如何在SSM框架中实现JSON格式的数据交互,涵盖核心配置、接口开发及常见场景处理。
核心依赖与配置:搭建JSON交互基础
要实现SSM框架的JSON数据交互,首先需要确保项目中引入支持JSON处理的依赖,并在SpringMVC中配置JSON解析器。
添加Maven依赖
项目中需引入以下核心依赖(以SpringMVC和Jackson为例,Jackson是SpringMVC默认的JSON处理库):
<!-- SpringMVC核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<!-- Jackson依赖(用于JSON与对象互转) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<!-- MyBatis依赖(数据访问层) -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
配置SpringMVC的JSON处理器
在SpringMVC的配置文件(如spring-mvc.xml)中,通过<mvc:annotation-driven/>自动注册JSON处理器,并配置JSON消息转换器(默认使用Jackson的MappingJackson2HttpMessageConverter):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描Controller层 -->
<context:component-scan base-package="com.example.controller"/>
<!-- 启用SpringMVC注解,自动注册JSON处理器 -->
<mvc:annotation-driven>
<!-- 可选:配置JSON格式化、日期格式等 -->
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<!-- 配置日期格式(避免返回时间戳) -->
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 静态资源处理 -->
<mvc:default-servlet-handler/>
</beans>
说明:
<mvc:annotation-driven/>会自动注册RequestMappingHandlerMapping(处理请求映射)和RequestMappingHandlerAdapter(处理方法调用),后者会集成MappingJackson2HttpMessageConverter用于JSON序列化/反序列化。- 通过配置
supportedMediaTypes指定响应内容类型为application/json,避免中文乱码。 dateFormat用于统一日期格式,避免返回类似1678886400000的时间戳。
Controller层:实现JSON数据响应与接收
Controller层是前后端数据交互的入口,通过@ResponseBody注解将Java对象转为JSON响应,或通过@RequestBody将请求体中的JSON数据转为Java对象。
返回JSON响应:@ResponseBody注解
场景1:返回单个对象
Controller方法直接返回Java对象,SpringMVC会自动通过Jackson将其转为JSON格式响应给前端。
@RestController // @Controller + @ResponseBody(类级别注解,简化方法)
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 根据ID查询用户,返回JSON格式的用户信息
* @param id 用户ID
* @return 用户对象(自动转为JSON)
*/
@GetMapping("/{id}")
public User getUserById(@PathVariable("id") Long id) {
return userService.getUserById(id);
}
}
请求示例:
GET /api/user/1
响应示例(JSON格式):
{
"id": 1,
"username": "张三",
"age": 25,
"createTime": "2023-03-15 14:30:00"
}
场景2:返回集合或复杂对象
Controller方法可直接返回List、Map或自定义复杂对象,Jackson会自动处理嵌套对象的JSON转换。
@GetMapping("/list")
public List<User> getUserList() {
return userService.getAllUsers();
}
@GetMapping("/info")
public Map<String, Object> getUserInfo() {
Map<String, Object> result = new HashMap<>();
result.put("user", userService.getUserById(1));
result.put("roles", Arrays.asList("admin", "user"));
return result;
}
响应示例(List):
[
{
"id": 1,
"username": "张三",
"age": 25
},
{
"id": 2,
"username": "李四",
"age": 30
}
]
响应示例(Map):
{
"user": {
"id": 1,
"username": "张三",
"age": 25
},
"roles": ["admin", "user"]
}
场景3:统一响应格式(推荐)
实际项目中,通常需要统一前后端交互的响应格式(如包含状态码、消息、数据字段),可通过封装统一响应对象实现。
// 统一响应对象
public class Result<T> {
private Integer code; // 状态码(200成功,500异常等)
private String message; // 响应消息
private T data; // 响应数据
// 构造方法、getter/setter省略
}
// Controller中使用
@GetMapping("/unified/{id}")
public Result<User> getUserByIdUnified(@PathVariable("id") Long id) {
User user = userService.getUserById(id);
if (user != null) {
return Result.success(user); // 假设Result.success()返回code=200, data=user
} else {
return Result.error("用户不存在"); // 假设Result.error()返回code=404, message="用户不存在"
}
}
响应示例:
{
"code": 200,
"message": "查询成功",
"data": {
"id": 1,
"username": "张三",
"age": 25
}
}
接收JSON请求:@RequestBody注解
前端通过POST/PUT请求发送JSON数据时,Controller方法可通过@RequestBody将请求体中的JSON字符串自动绑定到Java对象。
@RestController
@RequestMapping("/api/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 添加用户(接收JSON格式的用户信息)
* @param user 前端传递的JSON数据(自动转为User对象)
* @return 操作结果
*/
@PostMapping("/add")
public Result<String> addUser(@RequestBody User user) {
userService.addUser(user);
return Result.success("添加成功");
}
/**
* 批量添加用户(接收JSON数组)
* @param users 前端传递的JSON数组(自动转为List<User>)
* @return 操作结果
*/
@PostMapping("/batch-add")
public Result<String> batchAdd(@RequestBody List<User> users) {
userService.batchAdd(users);
return Result.success("批量添加成功");
}
}
请求示例(Postman):
- 请求方法:
POST - 请求URL:
/api/user/add



还没有评论,来说两句吧...