首页 > 其他分享 >SpringBoot - jackson 序列化配置,支持jdk8 时间类型和解决科学计数法

SpringBoot - jackson 序列化配置,支持jdk8 时间类型和解决科学计数法

时间:2023-06-22 14:03:13浏览次数:40  
标签:jackson ofPattern dd 计数法 javaTimeModule DateTimeFormatter new 序列化 class

jdk8时间序列化配置#
Copy@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper serializingObjectMapper() {
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        /** 序列化配置,针对java8 时间 **/
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));

        /** 反序列化配置,针对java8 时间 **/
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        
        return Jackson2ObjectMapperBuilder.json().modules(javaTimeModule).build();
    }        
}

另个写法,时间和double类型序列化配置#
Copy@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper serializingObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 设置时区
        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
    // 设置时间格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        JavaTimeModule javaTimeModule = new JavaTimeModule();
        /** 序列化配置,针对java8 时间 **/
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));

        /** 反序列化配置,针对java8 时间 **/
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        
        /** 声明自定义模块,配置double类型序列化配置 **/
        SimpleModule module = new SimpleModule("DoubleSerializer", new Version(1, 0, 0, ""));
        // 注意Double和double需要分配配置
        module.addSerializer(Double.class, new DoubleSerializer());
        module.addSerializer(double.class, new DoubleSerializer());

        /** 注册模块 **/
        objectMapper
                .registerModule(javaTimeModule)
                .registerModule(module)
        .registerModule(new Jdk8Module())
        .registerModule(new ParameterNamesModule());
        return objectMapper;
    }        
}

public class DoubleSerializer extends JsonSerializer<Double> {

    @Override
    public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException {
        BigDecimal d = new BigDecimal(value.toString());
        gen.writeNumber(d.stripTrailingZeros().toPlainString());
    }

    @Override
    public Class<Double> handledType() {
        return Double.class;
    }
}

关于解决double类型科学计数法的问题,还可以做如下配置,不需要自己写DoubleSerializer
CopyobjectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);

标签:jackson,ofPattern,dd,计数法,javaTimeModule,DateTimeFormatter,new,序列化,class
From: https://blog.51cto.com/u_16110904/6534786

相关文章

  • Python中的pickle模块:对象序列化与反序列化
    在Python中,对象的序列化和反序列化是一项常见的任务。pickle模块提供了一种简单且强大的方法来实现对象的序列化和反序列化,使得开发者能够方便地将复杂的Python对象转化为字节流并在需要时重新还原。本文将详细介绍pickle模块的使用方法和原理,并探讨其在数据持久化和跨进程通信中......
  • yaml.v3 - YAML 反序列化
    配置文件mysql:conn:1.1.1.1user:yangpassword:yangconsul:addr:2.2.2.2user:yangpassword:yang代码packagemainimport( "fmt" "gopkg.in/yaml.v3" "os")typeEnvSDstruct{ MysqlMysql`yaml:"mysql&q......
  • java反序列化(六)
    fastjson反序列化前置知识fastjson是阿里巴巴开发的一个处理json数据的开源库,简简单单解析一个json字符串是自然不会造成命令执行的,问题在于很多库为了实用性会额外实现一些功能,造成了攻击点fastjson简单使用引入依赖,先用古老版本<dependency><groupId>......
  • PHP反序列化构造POP链小练习
    一个师傅给的源码,来源不知,就当作小练习记录一下<?phperror_reporting(0);classVox{protected$headset;public$sound;publicfunctionfun($pulse){include($pulse);}publicfunction__invoke(){$this->fun($this->headset);......
  • 基类属性如何反序列化表示具体类的Json字符串
    JsonConverter可以决定类型如何被序列化或反序列化。接口属性被反序列化时,会抛出异常,因为接口没有构造函数。JsonConvert.DeserializeObject<IVehicle>("Json字符串");JsonConvert.DeserializeObject<List<IVehicle>>("Json字符串");JsonConvert.DeserializeObject<Worker>(......
  • Java序列化
    一、序列化和反序列化序列化:将数据结构或对象转换成二进制字节流的过程反序列化:将在序列化过程中产生的二进制字节流转换成数据结构或对象的过程 常见场景:1、网络传输时,对象需要先被序列化,接收到后再进行反序列化2、将对象持久化到磁盘、文件时需要先进行序列化,从磁盘或者......
  • JackSon版本导致错误
    使用Jackson时需要在Maven导入三个包jackson-databindjackson-corejackson-annotations我在使用时出现了如下的报错Causedby:org.springframework.beans.BeanInstantiationException:Failedtoinstantiate[org.springframework.web.servlet.mvc.method.annotation.Reques......
  • Jackson2ObjectMapperBuilderCustomizer
    //序列化时的命名策略——驼峰命名法builder.propertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);配置作用  ......
  • XML反序列化笔记
    反序列化枚举类型public银行卡类型marcaTarjeta{get;set;}publicenum银行卡类型{[XmlEnum(Name="0")]UnKnown=0,[XmlEnum(Name="1")]VISA=1,[XmlEnum(Name="2")]MASTERC......
  • C# xml序列化和反序列化
    **以前没有用C#定义的反序列化方式来定义对象,都是直接操作的xml元素,在用到Newlife.Core时,有用到既有属性又有值形式的xml反序列化对应对象定义例如:<catid="1">猫</cat>publicclassCat{[XmlAttribute]publicStringid{get;set;}[XmlTex......