Java反序列化接收多种格式日期-JsonDeserialize

问题

我们在反序列化时,通常使用以下注解:

java 复制代码
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
java 复制代码
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

@JsonFormat这个注解可以将日期序列化为我们指定的格式,同时也可以接收不同格式的日期到Java对象中,但是反序列化只支持一种格式。

  • 比如当我们使用 @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")时,前端传递yyyy-MM-dd HH:mm:ss格式数据时会丢失精度;
  • 当我们使用@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")时,前端传递yyyy-MM-dd格式数据会报错

解决方法

如果想要在反序列化时指定多种格式,可以使用@JsonDeserialize(using = xxxDateDeserializer.class)

xxxDateDeserializer继承JsonDeserializer允许自定义接收哪些格式,代码:

java 复制代码
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.Date;
@Slf4j
public class XxxDateDeserializer extends JsonDeserializer<Date> {


    public XxxDateDeserializer() {
    }


    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {

        // 使用hutool的日期解析 此处可以自定义格式解析
        String dateStr = p.getText();
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null;
        }
        try {
            return DateUtil.parse(dateStr);
        } catch (Exception e) {
            log.warn("hutool Date format failed: {}" ,dateStr);
        }

        throw new IOException("Date format failed: " + dateStr);
    }

}

序列化和反序列化

  1. 序列化 :当 Java 对象转换成 JSON 字符串时(例如,在 API 接口返回数据时),如何将 Date、LocalDateTime 等类型格式化成我们想要的字符串格式。
  2. 反序列化 :当接收到一个 JSON 字符串并要将其转换成 Java 对象时(例如,在 API 接口接收请求体时),如何将符合特定格式的字符串正确地解析成 Date、LocalDateTime 等类型。

我们在 Java 对象与 JSON 字符串之间进行序列化 和反序列化时,控制日期、时间、数字等类型数据的格式。

相关推荐
杨凯凡12 分钟前
Spring Boot 链路追踪实战:Micrometer、TraceId 与异步线程上下文传播
java·spring boot·后端
计算机毕设定制辅导-无忧学长28 分钟前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台
非优秀程序员9 小时前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员9 小时前
第06章 浙江帮的内战|《互联网产品恩仇录》
后端
非优秀程序员9 小时前
第08章 马云的反击|《互联网产品恩仇录》
后端
非优秀程序员10 小时前
题记|《互联网产品恩仇录》
后端·程序员·创业
非优秀程序员10 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻10 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊12 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang13 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope