【Kotlin】自定义Json反序列化

最近在项目中发现之前同事在使用Redis存储对象的时候,给日期字段存了两种不同的日期格式,进而导致查询时反序列化报错,因此写了一个注解配置类来自定义反序列化的方式。

kotlin 复制代码
/**
 * LocalDateTime反序列化,下方的LocalDate同理,可以略过
 */
class LocalDateTimeDeserializer : JsonDeserializer<LocalDateTime>() {
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): LocalDateTime {
        val dateStr = p.text
       	// 根据日期字符串的长度来判断对应的格式
        return when {
        	// 类似:2024-02-06 10:00:00
            dateStr.length == 19 -> LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
           	// 类似:2024-02-06T10:00:00.988+08:00
            dateStr.length >= 26 -> LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
            else -> throw IllegalArgumentException("Invalid date format: $dateStr")
        }
    }
}

/**
 * LocalDate反序列化
 */
class LocalDateDeserializer : JsonDeserializer<LocalDate>() {
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): LocalDate {
        val dateStr = p.text
        return when {
            dateStr.length == 10 -> LocalDate.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE)
            dateStr.length >= 26 -> LocalDate.parse(dateStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
            else -> throw IllegalArgumentException("Invalid date format: $dateStr")
        }
    }
}

接着只需要在对应的日期字段上加上注解即可。
@JsonDeserialize注解位于com.fasterxml.jackson.databind.annotation包下(Jackson

kotlin 复制代码
@JsonDeserialize(using = LocalDateTimeDeserializer::class)
var createTime: LocalDateTime? = null

这只是临时的解决方案,正确的做法是在一开始保存到Redis的时候就统一好日期格式,尽量不要出现多种格式百花齐放的情况。

相关推荐
程序员黑豆1 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
hey_sml2 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo2 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖4 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才4 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio4 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖5 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
不老刘6 小时前
【Java入门】Java服务部署方式全景对比:从java -jar到K8s
java·kubernetes·jar
离陌在学C#8 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
洛阳泰山8 小时前
AI 应用层被 Python 卷成红海,为什么我偏要用 Java 造一个 RAG + 工作流引擎?
java·人工智能·后端