使用 ObjectMapper 将 JSON 日期格式从 ZonedDateTime 序列化为自定义日期格式

Posted

技术标签:

【中文标题】使用 ObjectMapper 将 JSON 日期格式从 ZonedDateTime 序列化为自定义日期格式【英文标题】:Serialize JSON date format from ZonedDateTime to custom date format using ObjectMapper 【发布时间】:2020-02-12 12:36:12 【问题描述】:

ObjectMapper 不会将 ZonedDateTime 对象格式化为自定义对象。

POJO 不受我控制,因此我无法更改它。 我需要为 WS 序列化 POJO 对象。 POJO 有ZonedDateTime(我不知道为什么,因为它的日期来自数据库)。

我正在使用 Spring-boot 2.1.8.RELEASE,所以... 我把它放到我的依赖项中:

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

我还在 application.properties 中添加了这个:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false

在配置文件中,我在配置文件中添加了这个bean,因为尽快配置ObjectMapper以接受更改很重要:

@Bean
public ObjectMapper objectMapper() 
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.setTimeZone(TimeZone.getTimeZone(Locale.FRANCE.getDisplayName()));
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer());
    mapper.registerModule(javaTimeModule);
    return mapper;

还有这个类:

public class ZonedDateTimeSerializer extends JsonSerializer 

public static final DateTimeFormatter FORMATTER = 
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ", Locale.FRANCE);
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException 
    gen.writeString(((ZonedDateTime)value).format(FORMATTER));

我有带有ZonedDateTime 字段的 POJO:

public ZonedDateTime getStartDate() 
    return this.startDate != null ? this.startDate.withNano(0).withZoneSameLocal(ZoneId.of("Europe/Paris")) : null;


public void setStartDate(ZonedDateTime startDate) 
    this.startDate = startDate != null ? startDate.withNano(0).withZoneSameLocal(ZoneId.of("Europe/Paris")) : null;

在我的代码中,我自动装配了对象映射器并将这个 POJO 序列化,如下所示:

private final ObjectMapper mapper;
public MyClass(ObjectMapper mapper) 
    this.mapper = mapper;

...
mapper.writeValueAsString(contactVersion);

但我得到的是如下:

"startDate":"offset":"totalSeconds":7200,"id":"+02:00","rules":"transitions":[],...

还有很多信息,当时的 82.634765625kb 信息,我想要的只是:

"2019-10-15T17:00:53Z"

已解决:它可以正常工作。 我使用 IntelliJ,并在 Weblogic 12.2.1.3.0 下部署为自动部署,可能是我没有运行 Maven clean 所以我只是运行 Maven install 并在调试模式下运行它,所以它在没有 WRITE_DATE_AS_TIMESTAMPS=false 属性的情况下启动旧的 application.properties 文件。 我真的不知道,但它有效,应该是这样的。

【问题讨论】:

我不明白。有用。也许我在安装和部署之前没有清理这个应用程序属性(我的工作已经很晚了)。很抱歉,但它有效。 【参考方案1】:

使用返回类型字符串创建一个 getter 并将其标记为属性(并将您的原始 getter 或属性标记为 @JsonIgnored)。就这样:

@JsonGetter("startDate")
public String getStartDateAsString() 
    return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(startDate);

【讨论】:

你是说在 POJO 上?但我对 POJO 无能为力。它不在我的控制之下

以上是关于使用 ObjectMapper 将 JSON 日期格式从 ZonedDateTime 序列化为自定义日期格式的主要内容,如果未能解决你的问题,请参考以下文章

ObjectMapper 将日期更改为字符串

使用 ObjectMapper - 如何将 JSON 结果快速转换为 TableView

使用Jackson时转换JSON时,日期格式设置

ObjectMapper将json转对象报错处理

将 JSON 映射到我的模型数组 - ObjectMapper

jackson中objectMapper的使用