springmvc如何进行json格式转换及 json化日期格式

参考:https://zhuanlan.zhihu.com/p/60170376
fastjson:https://blog.youkuaiyun.com/weixin_43287478/article/details/103889295
HttpMessageConverter解读:https://segmentfault.com/a/1190000012658289


1.概述
HttpMessageConverter<T> 是Spring中的一个接口,负责将请求参数 转换成java类型参数(类型为T);或者将java类型数据 写入到http响应体中。

HttpMessageConverter接口的工作原理:
【注意】:有很重要的一点需要说明一下,springmvc可以同时配置多个Converter,根据一定的规则(主要是Content-Type、Accept、controller方法的consumes/produces、Converter.mediaType以及Converter的排列顺序这四个属性)来选择到底是使用哪一个。
若要转换json格式数据,那么就需要使用json的消息转换器来进行 转换处理。

如果要进行json格式数据的转换
那么必须在容器中注入能够处理json数据的消息转换器,举个栗子:可以注入MappingJackson2HttpMessageConverter这个类型的bean到IOC容器中,告诉springmvc我们需要进行Json格式的转换,MappingJackson2HttpMessageConverterHttpMessageConverter接口 的一种实现。springboot中 默认的使用的json消息转换器实现 就是它。

如何在容器中注入MappingJackson2HttpMessageConverter这个bean?
springmvc 应用中,我们只需要 在pom中加入如下3个jackjson相关的依赖,则MappingJackson2HttpMessageConverter 对象 就会自动的注入到IOC容器中,作为HttpMessageConverter的一种实现。
在这里插入图片描述
若是SpringBoot 应用,则web-stater依赖中默认就引入了jackson相关的依赖,使用jackson作为 json格式数据的消息转化器实现 。

jackson处理器中 提供了对 日期格式的默认处理方法,但是不满足我们的要求,我们需要设置 新的日期处理方法。

一般情况下日期的Java类型 和 数据库类型为

Java类型为:private Date createTime = new Date();
数据库类型为:
在这里插入图片描述

jackson默认对日期格式的处理结果:
在这里插入图片描述

重新设置了json日期格式后的结果:
在这里插入图片描述
2.解决json格式的日期输出的两种办法:

2.1 第一种:在日期字段上使用注解@JsonFormat

缺点:硬编码,这个是局部处理。
优点:灵活,想给哪个时间字段 格式化就给哪个时间字段格式化。

/** java8以前使用的 日期类型*/
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private Date lastUpdate;

/** java8 日期类型*/
@JsonFormat(pattern="yyyy-MM-dd", timezone="Europe/Zagreb")
private LocalDate birthday;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private LocalDateTime lastUpdate;

2.2 第二种:在application.yml中进行 全局配置

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss # 
    joda-date-time-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

优点:如果我们要为应用程序中的 所有日期 都配置默认格式,那么这种配置的方式是最推荐的。
缺点:这种方法存在缺陷。它不适用于Java 8日期类型如 LocalDateLocalDateTime。我们只能使用它来格式化java.util.Datejava.util.Calendar类型的字段 。

【兼容Java8日期格式的全局处理办法:】

兼容Java8Date类型的日期格式,那么我们需要创建一个Jackson2ObjectMapperBuilderCustomizer 的bean对象:

@Configuration
public class ContactAppConfig{

	private static final String dateFormat ="yyyy-MM-dd";
	private static final String dateTimeFormat ="yyyy-MM-dd 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和遗留日期类型。我们必须定义一个bean并覆盖其默认Bean,来设置我们所需的格式。 虽然这种方法可能看起来有点麻烦,但它的优点在于它适用于Java 8和遗留日期类型。

3.若想使用fastjson作为消息转换器?

fastjson是阿里巴巴的一个开源json解析框架,是目前解析速度最快的开源框架。

使用:
1、添加依赖
首先需要除去 web-starter中 默认的jackson的依赖。

<!--除去 web-starter中 默认的jackson的依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<exclusion>
			<groupId>com.fasterxml.jackson.core</groupId>
				<artifactId>jackson-databind</artifactId>
		</exclusion>
	</exclusions>
</dependency>

<!-- 引入fastjson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.47</version>
</dependency>

2、自定义提供一个FastJsonHttpMessageConverter

@Configuration
public class MyFastJsonConfig {
    @Bean
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        //配置日期 序列化后的格式
        config.setDateFormat("yyyy-MM-dd HH:mm:ss");
        converter.setFastJsonConfig(config);
        return converter;
    }
}

参考:https://blog.youkuaiyun.com/weixin_43287478/article/details/103889295

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值