Spring Boot Jackson JSR-310 - ZonedDateTime 总是时间戳

Posted

技术标签:

【中文标题】Spring Boot Jackson JSR-310 - ZonedDateTime 总是时间戳【英文标题】:Spring Boot Jackson JSR-310 - ZonedDateTime always timestamp 【发布时间】:2018-04-05 15:16:13 【问题描述】:

考虑这个 Spring MVC 控制器是使用 Spring Boot 开始的:

@RequestMapping("/foo")
public Foo get() 
    return new Foo();


public class Foo 
    @Getter
    @Setter
    private ZonedDateTime time = ZonedDateTime.now();

我想用 Jackson JSR-310 模块序列化 Foo 对象。这个依赖在类路径上:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

我的 application.properties 中也有杰克逊配置:

spring.jackson.serialization.write-dates-as-timestamps=false

根据杰克逊文档,它应该将其转换为 ISO 日期时间格式,但我仍然得到一个时间戳值......


  time: 1508867114.796

我注意到 ZonedDateTimeSerializer 内部:

@Override
public void serialize(ZonedDateTime value, JsonGenerator generator, SerializerProvider provider) throws IOException 
    if (!useTimestamp(provider)) 
        if (shouldWriteWithZoneId(provider)) 
            // write with zone
            generator.writeString(DateTimeFormatter.ISO_ZONED_DATE_TIME.format(value));
            return;
        
    
    super.serialize(value, generator, provider);

useTimestamp(provider) 被评估为 true,因此 application.properties 中的属性被忽略。

你知道我的代码有什么问题吗?

【问题讨论】:

如果你不需要时间戳,ZonedDateTimeSerializer 是不必要的。如果不需要,显示更多关于 useTimestamp 和 shouldWriteWithZoneId 的细节 【参考方案1】:

你快到了。如果您使用

注释您的 DTO Foo 的字段 time
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")

您的方法将奏效。你会得到结果:


    "time": "2019-12-07T17:05:59.000+0400"

在当前的 Spring Boot 版本 (2.2.x) 中,您可以省略 application.properties 配置条目 spring.jackson.serialization.write-dates-as-timestamps=false,因为它现在是默认设置。

【讨论】:

以上是关于Spring Boot Jackson JSR-310 - ZonedDateTime 总是时间戳的主要内容,如果未能解决你的问题,请参考以下文章

Jackson 在我的 Spring Boot 应用程序中忽略了 spring.jackson.properties

如何在 Spring Boot 1.4 中自定义 Jackson

Spring Boot没有使用Jackson Kotlin插件

Spring Boot 未使用 Jackson Kotlin 插件

spring-boot用jackson改变json响应结构

Spring boot + Jackson + LocalDateTime:日期解析不正确