jackson 日期格式化技巧使用 spring boot 时,需要使用 jackson 处理一些 java time api 类型的 json 序列化问题,在处理一些类的字段时,可以通过直接在属性上加注解的方式来指定其格式化样式。但是,昨天同事遇到一个格式化 map 数据的问题,这样就不能通过加注解来解决格式化样式的问题了。
在网上各种搜索,各种尝试后,终于解决了这个问题,记录一下,以备不时之需。
闲言少叙,直接上代码:
package com.diguage.demo.config;import com.fasterxml.jackson.databind.objectmapper;import com.fasterxml.jackson.databind.util.stddateformat;import com.fasterxml.jackson.datatype.jsr310.javatimemodule;import com.fasterxml.jackson.datatype.jsr310.deser.localdatedeserializer;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.context.annotation.bean;import org.springframework.context.annotation.configuration;import org.springframework.context.annotation.primary;import java.text.dateformat;import java.text.simpledateformat;import java.time.localdate;import java.time.localdatetime;import static com.fasterxml.jackson.databind.serializationfeature.*;import static java.time.format.datetimeformatter.ofpattern;/<strong> * 配置类 * * @author d瓜哥 · <a href="https://www.diguage.com/" rel="external nofollow" rel="external nofollow" target="_blank" >https://www.diguage.com</a> */@configurationpublic class config { /</strong> * 创建 objectmapper 对象,配置日期格式化 * * @author d瓜哥 · <a href="https://www.diguage.com/" rel="external nofollow" rel="external nofollow" target="_blank" >https://www.diguage.com</a> */ @bean @primary public objectmapper objectmapper() { objectmapper mapper = new objectmapper(); string datetimepattern = "yyyy-mm-dd hh:mm:ss"; string datepattern = "yyyy-mm-dd"; dateformat dateformat = new simpledateformat(datetimepattern); mapper.setdateformat(dateformat); mapper.configure(write_dates_as_timestamps, false); mapper.setdateformat(new stddateformat().withcolonintimezone(true)); javatimemodule javatimemodule = new javatimemodule(); javatimemodule.adddeserializer(localdate.class, new localdatedeserializer(ofpattern(datepattern))); javatimemodule.addserializer(localdate.class, new localdateserializer(ofpattern(datepattern))); javatimemodule.adddeserializer(localdatetime.class, new localdatetimedeserializer(ofpattern(datetimepattern))); javatimemodule.addserializer(localdatetime.class, new localdatetimeserializer(ofpattern(datetimepattern))); mapper.registermodule(javatimemodule); return mapper; }}
后续问题不知道通过这种方式指定日期格式化样式后,在处理一些打格式化样式注解的字段时,会有什么样的表现?有机会测试一下。
补充:jackson 统一配置 日期转换格式方式一:配置文件yml中配置
spring: jackson: default-property-inclusion: always time-zone: gmt+8 date-format: yyyy-mm-dd hh:mm:ss
这样序列化后,date类型会被格式化成配置中的格式。
方式二:配置类中配置创建jacksonconfig.java
@configurationpublic class jacksonconfig { @bean @order(ordered.highest_precedence) public jackson2objectmapperbuildercustomizer customjackson() { return new jackson2objectmapperbuildercustomizer() { @override public void customize(jackson2objectmapperbuilder builder) { builder.serializerbytype(localdatetime.class, new localdatetimeserializer(datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss"))); builder.serializerbytype(localdate.class, new localdateserializer(datetimeformatter.ofpattern("yyyy-mm-dd"))); builder.serializerbytype(localtime.class, new localtimeserializer(datetimeformatter.ofpattern("hh:mm:ss"))); builder.deserializerbytype(localdatetime.class, new localdatetimedeserializer(datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss"))); builder.deserializerbytype(localdate.class, new localdatedeserializer(datetimeformatter.ofpattern("yyyy-mm-dd"))); builder.deserializerbytype(localtime.class, new localtimedeserializer(datetimeformatter.ofpattern("hh:mm:ss"))); builder.serializationinclusion(jsoninclude.include.non_null); builder.failonunknownproperties(false); builder.featurestodisable(serializationfeature.write_dates_as_timestamps); } }; }}
以上就是springboot中jackson日期格式化的方法的详细内容。