SpringBoot环境Json对Date类型的处理

SpringBoot环境Json对Date类型的处理

  • SpringBoot 环境下默认使用的json库为Jackson,其默认使用ObjectMapper对数据进行序列化和反序列化处理。当对Date 类型的数据进行序列化时,默认使用YYYY-MM-DDTHH:mm:ss格式。且由于Jackson默认使用UTC时间标准(GMT+0),而我们国家默认是CST时间(GMT+8),也就是当数据以字符型数据传输时,将比CST时间少8小时。

Json Date自定义序列化和反序列化

序列化+反序列化 同时指定为YYYY-MM-DD

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.*;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;

@Configuration
public class MyObjectMapper extends ObjectMapper {
    public MyObjectMapper() {
        //指定null值不参与序列化(字段不被显示)
        this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        //指定序列化时不使用时间戳(一串long型值)
        this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //反序列化时忽略未知属性
        this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //忽略大小写
        this.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        // 设定序列化和反序列化的时间格式
        this.setDateFormat(new SimpleDateFormat ("yyyy-MM-dd"));
    }
}

适用场景

  • A、B两系统交互,且均使用yyyy-MM-dd的时间格式

单独对序列化指定日期格式

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.*;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;

/**
  * 指定序列化的格式为YYYY-MM-DD,此时反序列化为默认格式
  * 此种配置适用于,当与其他系统交互获取的日期为时间戳或者带有HH:mm:ss格式的数据时不至于导致数据丢失
  * 
  *
  */
@Configuration
public class MyObjectMapper extends ObjectMapper {
    public MyObjectMapper() {
        //指定null值不参与序列化(字段不被显示)
        this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        //指定序列化时不使用时间戳(一串long型值)
        this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //反序列化时忽略未知属性
        this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //忽略大小写
        this.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        // 生成自定义的序列化配置类
        SerializationConfig with = new ObjectMapper().getSerializationConfig().with(new SimpleDateFormat("yyyy-MM-dd"));
        this.setConfig(with);// 使用自定义的序列化格式
    }
}

适用场景

  • A、B两系统交互,A使用yyyy-MM-ddTHH:mm:ss,而B系统出于某种需要使用yyyy-MM-dd编码向外传输数据。此时只能对B系统的序列化单独指定格式。而反序列化仍然保持默认配置即可。

注意

  1. Jackson在进行数据传输时,默认使用UTC时间进行。再由接收端进行时区转换,若此时交互系统的日期格式不一致,可能导致日期无法被正确还原。
    • A 系统使用 yyyy-MM-ddTHH:mm:ss 序列化日期
    • B系统使用yyyy-MM-dd 反序列化
    • 此时A系统需要将2020-10-01 发送到B系统时,A实际发送的是2020-09-30T16:00:00(UTC时间比CST少8小时)
    • 若此时B系统采用yyyy-MM-dd反序列化,将直接导致日期后面的时间被截断,从而接收到2020-09-30,此时日期少一天
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值