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 HH:mm:ss
        - yyyy-MM-dd
        - HH:mm:ss

3、使用第三方库

可以使用像jackson-datatype-jsr310这样的库,提供了自动格式化的LocalDateTime序列化器。

总结:

通过添加@JsonFormat注解或者自定义序列化器,可以解决LocalDateTime的JSON序列化问题,避免格式不统一的问题。 

猜你喜欢

转载自blog.csdn.net/Microhoo_/article/details/131932191