问题概述
在SpringBoot中,需要对java8的java.time.LocalDateTime类进行个性化的JsonFormat。
处理前,默认处理的日期-时间效果
"create_time": {
"year": 2019,
"month": "JUNE",
"month_value": 6,
"day_of_month": 27,
"hour": 17,
"minute": 40,
"second": 43,
"nano": 503000000,
"day_of_week": "THURSDAY",
"day_of_year": 178,
"chronology": {
"id": "ISO",
"calendar_type": "iso8601"
}
}
想要实现的效果
"create_time": "2019-06-27 17:40:43.503"
处理过程说明
1. 添加jackson-datatype-jsr310
的引用
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.0</version>
</dependency>
2. 在Java属性上添加@JsonSerialize
和@JsonFormat
注解说明
/**
* 创建时间
*/
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
@Column(name = "create_time")
private LocalDateTime createTime = LocalDateTime.now();
SpringBoot全局序列化配置
这时,可能有朋友会说:每个LocalDateTime,我都想按照固定的格式来进行Json序列化,一个一个实体类去加注解,岂不是很麻烦?
别急,接下来我们来说一下全局配置:
需要在添加了@Configuration
注解的配置类中,添加如下代码:
/**
* 统一json输出风格
* See {@link com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy} for details.
* @param converters
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (int i = 0; i < converters.size(); i++) {
if (converters.get(i) instanceof StringHttpMessageConverter) {
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charsets.UTF_8);
stringHttpMessageConverter.setWriteAcceptCharset(false);
converters.set(i, stringHttpMessageConverter);
}
if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule("JsonMapSerializer", Version.unknownVersion());
// 对LocalDateTime类,提供统一的序列化方式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
simpleModule.addSerializer(new LocalDateTimeSerializer(dateTimeFormatter));
objectMapper.registerModule(simpleModule);
// 统一返回数据的输出风格
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategy.SnakeCaseStrategy());
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper);
converters.set(i, converter);
break;
}
}
}
然后,在具体类的成员变量上,就不用添加@JsonSerialize
和@JsonFormat
注解了。
参考:stackoverflow:JSON Java 8 LocalDateTime format in Spring Boot
stackoverflow:Serialize LocalDateTime with only milliseconds with Jackson