• SpringBoot_JsonFormat日期序列化


    SpringBoot_JsonFormat日期序列化

    1.什么是@JsonFormat

    @JsonFormat用来表示json序列化的一种格式或者类型。@JsonFormat注解是一个时间格式化注解,比如我们存储在mysql中的数据是date类型的,当我们读取出来封装在实体类中的时候,就会变成英文时间格式,而不是yyyy-MM-dd HH:mm:ss这样的中文时间,因此我们需要用到JsonFormat注解来格式化我们的时间。同时前端调用后端接口传参时,也需要通过注解来反序列化成Date对象。示例如下:

    @JsonFormat(shape =JsonFormat.Shape.STRING,pattern ="yyyy-MM-dd HH:mm:ss",timezone ="GMT+8")
    private Date createTime;
    
    • 1
    • 2

    2.兼容多种格式时间字符串

    上面示例只能指定一种日期的格式,但是我们前端可能传递各种类型的日期格式,这个时候我们需要自定义 Json 日期转换器,如下在日期类型的属性上添加 com.fasterxml.jackson.databind.annotation.JsonDeserialize注解。

    实现自定义序列化类:CustomDateSerializer

    package com.cloud.data.config;
    
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    /**
     * 自定义日期序列化
     *
     * http://t.zoukankan.com/jifeng-p-9700911.html
     * @date 2022/12/2
     */
    
    public class CustomDateSerializer extends JsonSerializer<Date> {
        @Override
        public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.ENGLISH);
            jsonGenerator.writeString(formatter.format(date));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    实现自定义反序列化类:DateJsonDeserializer

    package com.cloud.data.config;
    
    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.commons.lang3.time.DateUtils;
    
    import java.io.IOException;
    import java.text.ParseException;
    import java.util.Date;
    
    /**
     * 日期反序列化,兼容多种格式,适配前端多种格式的时间字符串
     *
     * https://my.oschina.net/u/2608182/blog/2877624;
     * @date 2022/12/2
     */
    
    public class DateJsonDeserializer extends JsonDeserializer<Date> {
        private static String[] pattern =
                new String[]{"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.SSS"};
    
        @Override
        public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            Date targetDate = null;
            String originDate = jsonParser.getText();
            if (StringUtils.isNotEmpty(originDate)) {
                try {
                    long longDate = Long.valueOf(originDate.trim());
                    targetDate = new Date(longDate);
                } catch (NumberFormatException e) {
                    try {
                        targetDate = DateUtils.parseDate(originDate, DateJsonDeserializer.pattern);
                    } catch (ParseException pe) {
                        throw new IOException(String.format(
                                "'%s' can not convert to type 'java.util.Date',just support timestamp(type of long) and following date format(%s)",
                                originDate,
                                StringUtils.join(pattern, ",")));
                    }
                }
            }
    
            return targetDate;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    实体类添加注解

    package com.cloud.data.dto;
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    import com.cloud.data.config.CustomDateSerializer;
    import com.cloud.data.config.DateJsonDeserializer;
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.Date;
    
    @Data
    public class BallDTO implements Serializable {
    
        private static final long serialVersionUID = 404038199619550497L;
    
        // @DateTimeFormat(pattern = Constant.DATETIME_PATTERN) // 控制入参
        // @JsonFormat(pattern= Constant.DATETIME_PATTERN,timezone=Constant.DEFAULT_TIMEZONE)
        private Date startTime;
    
        // @DateTimeFormat(pattern = Constant.DATETIME_PATTERN)
        // @JsonFormat(pattern= Constant.DATETIME_PATTERN,timezone=Constant.DEFAULT_TIMEZONE)
        private Date endTime;
    
        @JsonSerialize(using = CustomDateSerializer.class)
        public Date getStartTime() {
            return startTime;
        }
    
        @JsonDeserialize(using = DateJsonDeserializer.class)
        public void setStartTime(Date startTime) {
            this.startTime = startTime;
        }
    
        @JsonSerialize(using = CustomDateSerializer.class)
        public Date getEndTime() {
            return endTime;
        }
    
        @JsonDeserialize(using = DateJsonDeserializer.class)
        public void setEndTime(Date endTime) {
            this.endTime = endTime;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    3.参考链接

    [1]. SpringBoot 中使用 @RequestBody 时如何自定义需要转换的日期格式
    [2]. springboot @RequestBody使用JsonSerialize与 JsonDeserialize自定义转参数,处理Date日期格式
    [3]. @DateTimeFormat注解无效
    [4]. @JsonFormat 使用方法

  • 相关阅读:
    蓝桥杯——123
    LVS+Keepalived 高可用集群
    C语言:变长数组、函数与数组、GCC对C的扩展、变长数组的实现原理
    如果客户端禁止 cookie,session 还能用吗?
    G-Mixup: Graph Data Augmentation for Graph Classification
    WPF 控件专题 DockPanel 控件详解
    leetcode-电话号码组合(C CODE)
    【Linux】第十二站:进程
    Python求解线性规划——PuLP使用教程
    天龙八部科举答题问题和答案(全7/8)
  • 原文地址:https://blog.csdn.net/wml00000/article/details/128151131