在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数据格式转换”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!