如何修改Micronaut中java.time.OffsetDateTime的默认序列化/反序列化规则
问题描述
我正在使用Micronaut v3.8.1,通过Gradle引入Jackson序列化依赖:
implementation("io.micronaut.serde:micronaut-serde-jackson")
默认情况下,java.time.OffsetDateTime实例会被序列化为表示自Epoch以来毫秒数的数字。比如定义如下Kotlin类:
import io.micronaut.serde.annotation.Serdeable import java.time.OffsetDateTime @Serdeable class Thing(val created: OffsetDateTime)
返回的JSON结果类似:
{ "created": 1674594085000 }
希望修改配置,让OffsetDateTime序列化为ISO-8601格式的字符串,示例如下:
{ "created": "2023-01-24T21:01:25.191493200Z" }
解决方案
方法一:全局配置(推荐)
在Micronaut的配置文件中添加Jackson序列化配置,对所有Java 8日期时间类型生效:
若使用application.yml
micronaut: serde: jackson: serialization: write-dates-as-timestamps: false
若使用application.properties
micronaut.serde.jackson.serialization.write-dates-as-timestamps=false
开启该配置后,OffsetDateTime会自动序列化为符合ISO-8601标准的字符串格式。
方法二:局部字段注解
如果仅需针对特定字段调整序列化格式,可以在字段上添加@JsonFormat注解:
import io.micronaut.serde.annotation.Serdeable import com.fasterxml.jackson.annotation.JsonFormat import java.time.OffsetDateTime @Serdeable class Thing( @JsonFormat(shape = JsonFormat.Shape.STRING) val created: OffsetDateTime )
如需自定义更精确的格式,可指定pattern参数:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSX") val created: OffsetDateTime
内容的提问来源于stack exchange,提问作者Alexandre V.
相关产品推荐
相关产品推荐

