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

相关推荐
盗理者4 分钟前
AI Agent 技能分享|SQL 性能诊断与优化
java·sql·spring·skill
GitLqr4 分钟前
Java 26 终于原生支持 HTTP/3 了:告别 Netty,直接用 QUIC
java·netty·http3
用户409666013175114 分钟前
Jackson 序列化:@JsonIgnore / @JsonProperty / @JsonFormat / @JsonInclude / @JsonUnwrapped 一次讲清楚
java·后端
码路漫漫15 分钟前
用了 Caffeine,消息为什么还是被处理了两次?
java
云和数据.ChenGuang25 分钟前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
小龙报1 小时前
【优选算法】1.搜索插入位置 2.x的平方根
java·c语言·数据结构·c++·python·算法·蓝桥杯
山荷枝1 小时前
04-框架--SpringBoot
java·spring boot·后端
linux修理工1 小时前
内存占用 99% 且 Java 程序较多的优化建议
java·开发语言
weixin_460443561 小时前
企业考试系统如何对接OA、钉钉和企业微信?SSO单点登录、组织同步与权限一致性设计
java·开发语言·数据库
Sylvia33.1 小时前
篮球数据API的技术架构与工程实践:基于火星数据WebSocket实时推送体系
java·python·websocket·网络协议·架构