SSM框架中JSON数据的交互与应用详解**
在现代Web应用开发中,JSON(JavaScript Object Notation)因其轻量级、易解析、跨语言等特性,已成为前后端数据交换的主流格式,在经典的SSM(Spring + Spring MVC + MyBatis)框架组合中,JSON的使用贯穿于前端请求数据的接收、后端业务处理以及响应结果的返回等各个环节,本文将详细介绍在SSM框架中如何高效地使用JSON,包括配置、接收请求JSON数据、返回JSON响应以及常见问题的解决。
SSM中JSON交互概述
在SSM架构中,JSON的交互主要涉及以下几个方面:
- 前端发送JSON数据到后端:通常用于表单提交、AJAX请求等场景,后端需要能够解析这些JSON数据。
- 后端返回JSON数据到前端:后端处理完业务逻辑后,将Java对象转换为JSON格式响应给前端,前端再进行解析和渲染。
Spring MVC作为SSM中处理Web请求的核心,提供了强大的JSON支持,而MyBatis在处理结果映射时也常涉及JSON。
环境准备与核心依赖
要在SSM项目中使用JSON,首先需要确保引入相关的依赖,以Maven为例,主要需要jackson-databind(或fastjson、gson等,本文以Jackson为例,因其是Spring MVC默认支持的JSON库):
<!-- Jackson核心依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version> <!-- 使用合适的版本 -->
</dependency>
Spring MVC默认会自动配置Jackson的ObjectMapper,只要上述依赖在类路径下,通常无需额外配置即可进行JSON转换。
后端接收前端发送的JSON数据
当前端通过POST请求发送JSON数据到后端时,Spring MVC提供了非常便捷的方式来接收这些数据。
使用@RequestBody注解
@RequestBody注解用于将HTTP请求的body部分数据绑定到方法参数上,支持自动JSON到Java对象的转换。
示例:
前端发送JSON数据:
{
"username": "zhangsan",
"age": 25,
"email": "zhangsan@example.com"
}
后端Controller方法:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/user")
public class UserController {
@PostMapping("/add")
@ResponseBody // 表示直接返回数据,而非视图名
public String addUser(@RequestBody User user) {
// 此处user对象已经自动封装了前端传来的JSON数据
System.out.println("Received user: " + user.getUsername() + ", " + user.getAge());
// 处理业务逻辑...
return "User added successfully: " + user.getUsername();
}
}
// User实体类
public class User {
private String username;
private Integer age;
private String email;
// getters and setters
}
说明:
@RequestBody会将请求体的JSON字符串自动转换为User对象,要求User类的属性名与JSON的key一致,并且提供对应的setter方法或构造器。- 如果前端发送的JSON数据结构与Java对象不完全匹配,可以通过
@JsonIgnoreProperties(ignoreUnknown = true)注解在类上忽略未知属性,或使用@JsonProperty注解进行属性名映射。
获取原始JSON字符串
如果不想直接转换为对象,而是想先获取JSON字符串再手动处理,可以使用HttpServletRequest的getInputStream()或getReader()方法,但通常不推荐,除非有特殊需求。
后端向前端返回JSON数据
Spring MVC返回JSON数据主要有以下几种方式:
使用@ResponseBody注解
@ResponseBody可以加在方法上,表示方法的返回值直接写入HTTP响应体中,不会被解析为视图名,Spring MVC会自动将返回的Java对象转换为JSON格式。
示例:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController // @RestController相当于@Controller + @ResponseBody
@RequestMapping("/api/user")
public class UserController {
@GetMapping("/get")
public User getUser() {
User user = new User();
user.setUsername("lisi");
user.setAge(30);
user.setEmail("lisi@example.com");
return user; // Spring MVC会自动将User对象转换为JSON
}
}
访问/api/user/get,响应体内容为:
{
"username": "lisi",
"age": 30,
"email": "lisi@example.com"
}
说明:
@RestController是Spring 4.0引入的注解,它组合了@Controller和@ResponseBody,表明该控制器类所有方法的返回值都将作为响应体直接返回,非常适合RESTful API开发。- 对于单个方法,也可以使用
@ResponseBody。
使用ResponseEntity封装响应
ResponseEntity允许你更灵活地控制HTTP响应,包括状态码、响应头和响应体。
示例:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/user")
public class UserController {
@GetMapping("/getWithEntity")
public ResponseEntity<User> getUserWithEntity() {
User user = new User();
user.setUsername("wangwu");
user.setAge(28);
user.setEmail("wangwu@example.com");
return new ResponseEntity<>(user, HttpStatus.OK);
}
@GetMapping("/getCustomHeader")
public ResponseEntity<String> getUserWithCustomHeader() {
User user = new User();
user.setUsername("zhaoliu");
user.setAge(35);
user.setEmail("zhaoliu@example.com");
return ResponseEntity.ok()
.header("Custom-Header", "some-value")
.body("User info: " + user.getUsername());
}
}
处理集合、Map等复杂对象
Spring MVC的JSON转换器也支持返回集合(List、Set)、Map、数组等复杂对象。
示例:
@GetMapping("/list")
public List<User> getUserList() {
List<User> users = new ArrayList<>();
users.add(new User("user1", 20, "user1@example.com"));
users.add(new User("user2", 25, "user2@example.com"));
return users;
}
@GetMapping("/map")
public Map<String, Object> getUserMap() {
Map<String, Object> map = new HashMap<>();
map.put("code", 200);
map.put("message", "success");
map.put("data", new User("mapUser", 40, "mapuser@example.com"));
return map;
}
MyBatis中的JSON处理
MyBatis本身不直接处理JSON,但可以在SQL映射文件或注解中,以及结果集映射时与JSON结合。
查询结果为JSON字符串
如果数据库中某个字段存储的是JSON字符串,而你希望查询时直接转换为Java对象,可以使用MyBatis的类型处理器(TypeHandler)或JDBC的setObject/getObject结合Jackson/Gson等库进行手动转换。
示例(自定义TypeHandler):
// 自定义JSON类型处理器
@MappedTypes(Object.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JsonTypeHandler implements TypeHandler<Object> {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
try {
ps.setString(i, objectMapper.writeValueAsString(parameter));
} catch (JsonProcessingException e) {
throw new SQLException("Error converting object to JSON string", e);
}
}
@Override
public Object getResult(ResultSet rs, String columnName) throws SQLException {
String jsonStr = rs.getString(columnName);
return parseJson(jsonStr);
}
@Override
public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
String jsonStr = rs.getString(columnIndex);
return parseJson(jsonStr);
}
@Override
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
String jsonStr = cs.getString(columnIndex);
return parseJson(jsonStr);
}
private Object parseJson(String jsonStr) {
if (jsonStr == null || jsonStr.isEmpty()) {
return null;
}
try {
// 这里简单示例,实际应根据目标类型进行泛型化处理或指定类型
return objectMapper.readValue(jsonStr, Object.class);
} catch (JsonProcessingException e) {
throw new SQLException("Error parsing JSON string to object", e);
}
}
}
然后在Mapper接口的方法上使用:
public interface UserMapper {


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