在SpringMVC中,Json数据格式转换是一个常见的需求,以下是关于如何在SpringMVC中进行Json数据格式转换的详细解析:
概述
在SpringMVC中,HttpMessageConverter<T>接口负责将请求参数转换成Java类型参数(类型为T),或者将Java类型数据写入到HTTP响应体中,为了转换Json格式数据,需要使用Json的消息转换器进行处理,常用的Json消息转换器是MappingJackson2HttpMessageConverter,它是HttpMessageConverter接口的一种实现。

环境配置
1. jar包准备
SpringMVC默认使用:MappingJackson2HttpMessageConverter对json数据进行转换,需要加入jackson的包,如下:
jacksonannotations2.8.8.jar:JSON转换注解包;
jacksoncore2.8.8.jar:JSON转换核心包;
jacksondatabind2.8.8.jar:JSON转换的数据绑定包。
2. springmvc.xml文件中的配置
如果配置文件中配置过注解驱动(<mvc:annotationdriven/>),则无需多余配置。
如果没有配置注解驱动,则需如下配置(不推荐使用这种方式):
<!注解适配器 >
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</list>
</property>
</bean>
Controller的编写
1. @RequestBody
作用:@RequestBody注解用于读取HTTP请求的内容(字符串),通过SpringMVC提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
示例:接收http请求的json数据,将json数据转换为java对象。
@RequestMapping("/requestJson")
@ResponseBody
public User requestJson(@RequestBody User user) throws Exception{
System.out.println(user);
return user; //由于@ResponseBody注解,将user转成json格式返回
}
2. @ResponseBody

作用:该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。
示例:将controller方法返回对象转换为json响应给客户端。
@RequestMapping("/showJson2")
@ResponseBody
public User showJsonInfo2(){
User user3 =new User(3,"小美","333");
return user3;
}
3. @RestController
作用:在类上添加@RestController注解,可以将该类下所有的控制器方法的返回值都转换成Json格式,从Spring 4.0开始,@RestController注解中包含了@ResponseBody。
示例:
@RestController
public class TestController2 {
@RequestMapping("test2")
public User getUserJson(){
User user =new User(1,"第一名","123");
return user;
}
}
4. ResponseEntity
作用:ResponseEntity提供了一种更灵活的方式来构建HTTP响应,包括状态码、头部信息和响应体,你可以将JSON对象作为响应体返回。
示例:
@Controller
public class TestController3 {
@RequestMapping("/testEntity")
public ResponseEntity<User>getJson(){
User user =new User(2,"第二名也不错","111");
return ResponseEntity.ok(user);
}
}
解决json格式的日期输出的两种办法
1. 第一种:在日期字段上使用注解@JsonFormat
缺点:硬编码,这个是局部处理。
优点:灵活,想给哪个时间字段格式化就给哪个时间字段格式化。
@JsonFormat(pattern="yyyyMMdd HH:mm:ss", timezone="Europe/Zagreb") private Date lastUpdate;
2. 第二种:在application.yml中进行全局配置

优点:如果我们要为应用程序中的所有日期都配置默认格式,那么这种配置的方式是最推荐的。
缺点:这种方法存在缺陷,它不适用于Java 8日期类型如LocalDate和LocalDateTime,我们只能使用它来格式化java.util.Date或java.util.Calendar类型的字段。
spring:
jackson:
dateformat: yyyyMMdd HH:mm:ss #
jodadatetimeformat: yyyyMMdd HH:mm:ss
timezone: GMT+8
3. 兼容Java8日期格式的全局处理办法
我们需要创建一个Jackson2ObjectMapperBuilderCustomizer的bean对象:
@Configuration
public class ContactAppConfig{
private static final String dateFormat ="yyyyMMdd";
private static final String dateTimeFormat ="yyyyMMdd HH:mm:ss";
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer(){
return builder >{
builder.simpleDateFormat(dateTimeFormat);
//java8日期格式的json处理
builder.serializers(newLocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
builder.serializers(newLocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
};
}
}
上面的示例它适用于Java 8和遗留日期类型,我们必须定义新的序列化器,以便能够正确地序列化LocalDate和LocalDateTime类型。
相关表格
| 注解 | 描述 | 示例 | 适用场景 |
| @RequestBody | 读取HTTP请求的内容,将其转换为json、xml等格式的数据并绑定到controller方法的参数上 | @RequestBody User user |
接收HTTP请求中的JSON数据并将其转换为Java对象 |
| @ResponseBody | 将Controller的方法返回的对象转换为指定格式的数据如json,xml等,通过Response响应给客户端 | @ResponseBody User showJsonInfo2() |
将Java对象转换为JSON数据并返回给客户端 |
| @RestController | 在类上添加此注解,可以将该类下所有的控制器方法的返回值都转换成Json格式 | @RestController public class TestController2 |
简化开发,使所有方法的返回值自动转换为JSON格式 |
| ResponseEntity | 提供一种更灵活的方式来构建HTTP响应,包括状态码、头部信息和响应体 | ResponseEntity.ok(user) |
构建包含状态码、头部信息和响应体的HTTP响应 |
| @JsonFormat | 在日期字段上使用,指定日期的格式化方式 | @JsonFormat(pattern="yyyyMMdd HH:mm:ss", timezone="Europe/Zagreb") private Date lastUpdate; |
对特定的日期字段进行格式化处理 |
| Jackson2ObjectMapperBuilderCustomizer | 自定义Jackson ObjectMapper的配置,如日期格式等 | builder.simpleDateFormat(dateTimeFormat); |
对整个应用程序进行统一的日期格式设置 |
相关问题与解答栏目
1、问题:如何在SpringMVC中配置多个HttpMessageConverter?
解答:可以通过在springmvc.xml文件中配置多个HttpMessageConverter来实现,可以同时配置StringHttpMessageConverter和MappingJackson2HttpMessageConverter,具体配置如下:
<bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF8</value>
</list>
</property>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringConverter"/>
<ref bean="jsonConverter"/>
</list>
</property>
</bean>
这样,SpringMVC就会根据ContentType、Accept等属性自动选择合适的消息转换器。
2、问题:如何在SpringMVC中处理复杂的JSON对象?
解答:对于复杂的JSON对象,可以定义相应的Java类来表示JSON结构,并使用@RequestBody和@ResponseBody注解来处理请求和响应,如果有一个包含用户信息的JSON对象,可以定义一个User类,并在Controller中使用@RequestBody来接收JSON数据,使用@ResponseBody来返回JSON数据,具体示例如下:
public class User {
private int id;
private String name;
private String email;
// getters and setters...
}
@RequestMapping("/user")
@ResponseBody
public User getUser() {
User user = new User();
user.setId(1);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
return user; // SpringMVC会自动将User对象转换为JSON并返回给客户端
}
以上就是关于“SpringMVC中Json数据格式转换”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!














