SpringBoot jackson objectMapper 反序列化日期dateFormat扩展

丌官皓君
2023-12-01

yyyy-MM-dd HH:mm:ss 这种格式的日期在项目中非常的常用,但是SpringBoot使用个jackson却默认不支持这种日期的反序列化,那就只有我们自己来实现它了,非常的简单粗暴..

 我们只需要覆盖jackson的objectMapper类里边的dateFormat即可,直接上代码

定义扩展的dateformat类


import java.text.DateFormat;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * .扩展jackson日期格式化支持格式
 */
public class ObjectMapperDateFormatExtend extends DateFormat {

    private static final long serialVersionUID = 1L;
    private DateFormat dateFormat;

    private SimpleDateFormat format1 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");

    public ObjectMapperDateFormatExtend(DateFormat dateFormat) {//构造函数传入objectmapper默认的dateformat
        this.dateFormat = dateFormat;
    }
    //序列化时会执行这个方法
    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
        return dateFormat.format(date,toAppendTo,fieldPosition);
    }
    //反序列化时执行此方法,我们先让他执行我们自己的format,如果异常则执执行他的
    //当然这里只是简单实现,可以有更优雅的方式来处理更多的格式
    @Override
    public Date parse(String source, ParsePosition pos) {
        Date date;

        try {
            date = format1.parse(source, pos);
        } catch (Exception e) {
            date = dateFormat.parse(source, pos);
        }
        return date;
    }
    //此方法在objectmapper 默认的dateformat里边用到,这里也要重写
    @Override
    public Object clone() {
        DateFormat dateFormat = (DateFormat) this.dateFormat.clone();
        return new ObjectMapperDateFormatExtend(dateFormat);
    }
}

覆盖objectmapper默认的dateformat

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
		DateFormat dateFormat = objectMapper.getDateFormat();
		objectMapper.setConfig(objectMapper.getDeserializationConfig().with(new ObjectMapperDateFormatExtend(dateFormat)));//反序列化扩展日期格式支持
        return objectMapper;
    }

这里只是让反序列化的时候使用我们自己定义的方式执行,如果想要在序列化的时候也使用的话,直接设置dateformat即可

objectMapper.setDateFormat(new ObjectMapperDateFormatExtend(dateFormat));

注意:这里只是反序列化日期格式支持,可能有时区问题,可以根据自己需要,在format的时候添加时区信息

转载于:https://my.oschina.net/xiwanglr/blog/2056236

 类似资料: