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

相关推荐
笨蛋不要掉眼泪5 小时前
Java并发编程:深入剖析 ArrayBlockingQueue
java·开发语言·算法·并发
Refrain_zc5 小时前
Android 封装 BaseMultipleChoiceAdapter 快速实现列表多选编辑
java
波诺波5 小时前
最小 SOFA XML 场景结构 0-base.scn
xml·java·前端
李少兄5 小时前
深入理解 Web 服务器、Servlet 容器与现代 Java Web 架构
java·服务器·servlet
weixin_399380695 小时前
Tongweb7049m10适配skywalking(by lqw)
java·skywalking
写了20年代码的老程序员5 小时前
企业微信、飞书、钉钉 Webhook 接入,后端代码为什么总是越写越丑
java·微信
解决问题no解决代码问题6 小时前
设计模式分类介绍
java·开发语言·设计模式
码不停蹄的玄黓6 小时前
SpringBoot 自动装配原理
java·spring boot·后端
白露与泡影6 小时前
Java虚拟线程实战:从线程池痛点到性能优化全流程
java·开发语言·性能优化
码上有光6 小时前
c++模板进阶知识讲解(对模板的进一步的运用与理解)
java·前端·c++·特化·模板进阶·偏特化