如何将LocalDateTime以ISO-8601格式序列化为JSON字符串?
如何将LocalDateTime以ISO-8601格式序列化为JSON字符串?
嘿,我之前也碰到过一模一样的问题!你现在的代码已经正确注册了JavaTimeModule,但Jackson默认对Java 8的LocalDateTime类型是序列化成数组形式的,要改成你想要的ISO-8601字符串格式,只需要加个简单的配置就行,下面给你两种可行的方案:
方案一:全局禁用时间戳序列化特性
这是最快捷的方式,只需要给ObjectMapper添加一行配置,让它不要把日期类型序列化为时间戳或数组,改用标准ISO格式:
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import java.time.LocalDateTime // 先修正你的data class语法错误 data class Task(val name: String, val dueDate: LocalDateTime) fun main() { val objectMapper = ObjectMapper() .registerModule(JavaTimeModule()) // 关键配置:禁用将日期序列化为时间戳/数组的特性 .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) // 修正Task实例的创建语法 val task = Task("task", LocalDateTime.now()) val json = objectMapper.writeValueAsString(task) println(json) }
运行这段代码后,你就能得到期望的输出:
{"name":"task","dueDate":"2023-03-11T16:1:54.728"}
方案二:自定义时间格式化器(按需调整格式)
如果你需要对时间格式做更精细的控制(比如调整毫秒位数、修改分隔符等),可以给LocalDateTime指定自定义的序列化器:
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer import java.time.LocalDateTime import java.time.format.DateTimeFormatter data class Task(val name: String, val dueDate: LocalDateTime) fun main() { // 自定义ISO风格的格式化器,你可以根据需求修改pattern val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS") val javaTimeModule = JavaTimeModule() // 给LocalDateTime注册自定义序列化器 .addSerializer(LocalDateTime::class.java, LocalDateTimeSerializer(dateFormatter)) val objectMapper = ObjectMapper() .registerModule(javaTimeModule) val task = Task("task", LocalDateTime.now()) val json = objectMapper.writeValueAsString(task) println(json) }
这个方案的灵活性更高,能适配各种自定义的时间格式需求。
备注:内容来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

