LocalDateTime的json格式化问题
目录
解决:
1、注册日期序列化器
2、自定义LocalDateTime的JSON格式
3、使用第三方库
总结:
实体类中定义了LocalDateTime类型的属性,获取数据会出现以下日期格式问题:
讲述:
对于LocalDateTime的JSON序列化和反序列化,需要注意它的JSON格式化问题。
LocalDateTime默认的JSON格式LocalDateTime默认序列化为ISO8601格式的字符串,如:”2023-07-25T12:00:00”。
这种格式不太人性化,而且不同的JSON库会有格式差异。
#
解决:
1、注册日期序列化器
为确保全局格式一致,可以注册自定义的LocalDateTime序列化器: (配置类)
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Configuration
public class LocalDateTimeSerializerConfig {
private static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
private static final String DATE_PATTERN = "yyyy-MM-dd";
/**
* string转localdatetime
*/
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new Converter<String, LocalDateTime>() {
@Override
public LocalDateTime convert(String source) {
if (source.trim().length() == 0) {
return null;
}
// 先尝试ISO格式: 2019-07-15T16:00:00
try {
return LocalDateTime.parse(source);
} catch (Exception e) {
return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DATE_TIME_PATTERN));
}
}
};
}
/**
* 统一配置
*/
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
JavaTimeModule module = new JavaTimeModule();
LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
return builder -> {
builder.simpleDateFormat(DATE_TIME_PATTERN);
builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_PATTERN)));
builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_PATTERN)));
builder.modules(module);
};
}
}
此时再去获取数据,格式就好了。
上面的方案全局生效,当全局的格式化方式无法满足我们需求时,我们对日期格式要做特殊的处理:在类的属性上添加注解。
2、自定义LocalDateTime的JSON格式
可以通过@JsonFormat注解自定义格式:
注意:这种方式只针对单个的数据类型,而非全局,每一个都需要注解去格式化日期。(比较麻烦)
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime createTime;
常用的格式化pattern包括:
- yyyy-MM-dd HHss
- yyyy-MM-dd
- HHss
3、使用第三方库
可以使用像jackson-datatype-jsr310这样的库,提供了自动格式化的LocalDateTime序列化器。
总结:
通过添加@JsonFormat注解或者自定义序列化器,可以解决LocalDateTime的JSON序列化问题,避免格式不统一的问题。
还没有评论,来说两句吧...