【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的时候就统一好日期格式,尽量不要出现多种格式百花齐放的情况。

相关推荐
SL_staff3 分钟前
城商行营销翻车复盘:JVS-Rules 如何用工程化机制保障规则变更的可溯性与稳定性
java·开源·全栈
hai_android5 分钟前
深入理解 Java 的四种引用:强引用、软引用、弱引用、虚引用
android·kotlin·android jetpack
vipxieliang9 分钟前
ValidX 多租户系统的数据验证方案
java·spring boot
SimonKing9 分钟前
一个 jar 搞定实时推送:我的轻量级 SSE 中间件 Stream Nexus
java·后端·程序员
杨杨杨大侠9 分钟前
聊几句就能让 AI 写代码,Spec 还有必要吗?
java·openai·ai编程
编程老船长9 分钟前
模型中立——把大模型做成"可替换零件",而不是焊死在业务里
java·前端·后端
用户21816970493010 分钟前
java List Set Map
java
IT枫斗者枫哥10 分钟前
MyBatis只查两次,为什么还会查到别家客户?
java·数据库
明月_清风11 分钟前
Tomcat 到底是什么?一篇文章搞懂 Java Web 的 Tomcat
java·后端
xiaoqiMikko13 分钟前
JVM 线上排查实战(三):grep BLOCKED 找不到的死锁,和 jstack 根本不报的死锁
java·jvm