SpringMVC接收JSON数据的完整指南**
在现代Web开发中,JSON(JavaScript Object Notation)因其轻量级、易解析的特性,成为了前后端数据交互的主流格式,SpringMVC作为Java EE领域非常流行的Web框架,提供了多种便捷的方式来接收和处理前端发送的JSON数据,本文将详细介绍SpringMVC接收JSON数据的几种常用方法、配置步骤及最佳实践。
准备工作:引入依赖
在开始之前,确保你的SpringMVC项目中已经包含了处理JSON所必需的依赖,我们会使用Jackson库,它是SpringMVC默认的JSON处理库。
如果你使用的是Maven,在pom.xml中添加以下依赖:
<!-- Jackson核心库 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新稳定版本 -->
</dependency>
<!-- Jackson注解支持(可选,但常用) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.15.2</version>
</dependency>
<!-- Jackson数据格式支持(如json,可选) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.15.2</version>
</dependency>
如果你使用的是Gradle,则在build.gradle中添加:
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2' implementation 'com.fasterxml.jackson.core:jackson-annotations:2.15.2' implementation 'com.fasterxml.jackson.core:jackson-core:2.15.2'
配置SpringMVC支持JSON
在SpringMVC的配置文件中(通常是spring-mvc.xml),你需要确保已经启用了<mvc:annotation-driven/>,这个配置会自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter,并且会配置好HttpMessageConverter,其中就包括MappingJackson2HttpMessageConverter,它负责JSON的序列化和反序列化。
<?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.yourpackage.controller"/>
<!-- 启动SpringMVC注解驱动,自动配置HttpMessageConverter -->
<mvc:annotation-driven/>
<!-- 其他配置,如视图解析器等 -->
<!-- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean> -->
</beans>
如果你的项目是基于Spring Boot的,那么恭喜你,Spring Boot已经自动配置好了这一切,你无需额外配置,只需引入Jackson依赖即可。
接收JSON数据的几种方式
接收单个JSON对象(@RequestBody + POJO)
这是最常用也是最推荐的方式,当前端发送一个JSON对象,并且后端希望将其映射到一个Java对象(POJO/Entity)时使用。
步骤:
-
创建POJO类:该类的属性需要与JSON数据的键一一对应。
public class User { private String username; private Integer age; private String email; // 无参构造器、getter、setter、toString() 方法 // 省略... } -
在Controller方法中使用
@RequestBody注解: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.ResponseBody; @Controller public class UserController { @PostMapping("/user") @ResponseBody // 如果直接返回对象,且配置了消息转换器,可以省略,或使用@RestController public String addUser(@RequestBody User user) { // 处理接收到的User对象 System.out.println("Received user: " + user); // 这里可以进行数据库操作等 return "User added successfully: " + user.getUsername(); } }
前端发送示例(使用jQuery AJAX):
$(document).ready(function(){
var user = {
username: "john_doe",
age: 30,
email: "john.doe@example.com"
};
$.ajax({
url: "/user",
type: "POST",
contentType: "application/json", // 重要:指定请求内容类型为JSON
data: JSON.stringify(user), // 将对象转换为JSON字符串
success: function(response){
alert(response);
},
error: function(xhr, status, error){
console.error("Error: " + error);
}
});
});
说明:
@RequestBody注解表示将HTTP请求体的内容绑定到方法参数上。- 前端发送请求时,必须设置
contentType: "application/json"。 - 前端发送的数据通常是JSON字符串(通过
JSON.stringify()转换)。
接收JSON数组(@RequestBody + List/数组)
如果前端发送的是一个JSON数组,后端可以直接使用List或者数组类型来接收。
步骤:
-
Controller方法参数使用
List或数组:import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; @Controller public class UserController { @PostMapping("/users") @ResponseBody public String addUsers(@RequestBody List<User> users) { // 处理接收到的User列表 System.out.println("Received users count: " + users.size()); users.forEach(System.out::println); return "Users added successfully: " + users.size(); } }
前端发送示例(jQuery AJAX):
var users = [
{username: "alice", age: 25, email: "alice@example.com"},
{username: "bob", age: 28, email: "bob@example.com"}
];
$.ajax({
url: "/users",
type: "POST",
contentType: "application/json",
data: JSON.stringify(users),
success: function(response){
alert(response);
}
});
接收JSON字符串并手动解析(不常用,了解即可)
你可能需要直接获取原始的JSON字符串,然后手动进行解析,这种方式较少推荐,因为SpringMVC已经提供了自动转换的便利。
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import com.fasterxml.jackson.databind.ObjectMapper;
@Controller
public class JsonStringController {
@PostMapping("/jsonString")
@ResponseBody
public String handleJsonString(@RequestBody String jsonString) {
System.out.println("Received JSON string: " + jsonString);
// 手动解析JSON字符串
ObjectMapper objectMapper = new ObjectMapper();
try {
User user = objectMapper.readValue(jsonString, User.class);
System.out.println("Parsed user: " + user);
return "Parsed user: " + user.getUsername();
} catch (Exception e) {
e.printStackTrace();
return "Error parsing JSON: " + e.getMessage();
}
}
}
说明: 这种方式需要手动处理JSON解析,增加了代码复杂度,且容易出错,除非有特殊需求,否则优先使用方式一和方式二。
使用Map接收JSON对象(灵活,但类型不安全)
如果JSON数据的结构不固定,或者你不想创建对应的POJO类,可以使用Map来接收。
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Map;
@Controller
public class JsonMapController {
@PostMapping("/jsonMap")
@ResponseBody
public String handleJsonMap(@RequestBody Map<String, Object> payload) {
// 处理接收到的Map
System.out.println("Received payload map: " + payload);
payload.forEach((key, value) -> {
System.out.println(key + ": " + value + " (type: " + value.getClass().getSimpleName() + ")");
});
return "Received map with " + payload.size() + " entries.";
}
}
说明:
Map的键是String类型



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