当前位置: 首页 > 知识库问答 >
问题:

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

谭昱
2023-03-14

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

波乔不在我的控制之下,所以我不能改变它。我需要序列化WS的POJO对象。POJO有ZoneDateTime(我不知道为什么,因为它的日期来自数据库)。

我使用的是Spring boot 2.1.8。释放,所以。。。我将其放入我的依赖项中:

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

我还在应用程序中添加了这个。特性:

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下部署为autodeploy,这可能是因为我没有运行Maven clean,所以我只运行Maven install,并在调试模式下运行它,所以它在启动时没有使用旧应用程序的WRITE_DATE_as_TIMESTAMPS=false属性。属性文件。我真的不知道,但它是有效的,应该是这样的。

共有1个答案

何浩荡
2023-03-14

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

@JsonGetter("startDate")
public String getStartDateAsString() {
    return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(startDate);
}
 类似资料:
  • 我正在尝试用自定义日期格式序列化和反序列化相当简单的对象: 在执行main方法时,我希望得到类似于: “日期”:“20151117” 20151117 但不幸的是得到了以下几点: {“日期”:“20151117”} 20151117-01-01T00:00:00.000+03:00(年份不正确) 似乎Jackson忽略了对象反序列化的@JSONFORMAT注释,并将字符串视为ISO-8601符号中

  • 我有类似“2021-06-01”的字符串,我希望将其转换为“2021-06-01T00:00:00+02:00”。我知道,最简单的解决方案是串接: 但是,我希望使用来实现。目前我的解决方案是: 然后使用: 然而,它抱怨说: 有解决办法吗?

  • 问题内容: 我正在使用Jersey + Jackson为我的应用程序提供REST JSON服务层。我的问题是默认的日期序列化格式如下所示: 起初我以为这是UNIX时间戳…但是太长了。我的客户端JS库在反序列化此格式时遇到了问题(它支持一堆不同的日期格式,但我认为不支持)。我想更改格式,以便可以由我的库使用(例如ISO)。我该怎么做…我发现了一段代码可能会有所帮助,但是…由于我不控制Jackson序

  • 在使用date格式自动设置为IE后,我试图解析某个包含日期条目为纪元数值的json文档。我需要不同的格式(也需要一毫秒) 所以问题是,如何解析IE。转换为带有Bson文档的某种自定义格式字符串。解析方法? 编辑:只是一个更新:问题在document.parse方法中,因为我不知道如何在解析json文档时使用tell.parse函数来使用自定义的日期格式。我总是得到某种默认的日期格式。如何发送给.p

  • 问题内容: 我正在使用需要json日期格式的API。 我需要转换我的JavaScript日期 1970年1月17日星期六格林尼治标准时间+0100(浪漫标准时间) 以json日期格式 /日期(1405699200)/ 问题答案: 列各项可以吗?

  • 我正在开发一个API,使用ASP公开一些数据。NET Web API。 在其中一个API中,客户端希望我们以格式公开日期。我不想为此更改全局设置(例如,),因为它非常特定于此客户端。我在为多个客户开发的解决方案中做到了这一点。 我能想到的一个解决方案是创建一个自定义的,然后将其放入我需要进行自定义格式化的属性中 例如。 只是想知道是否还有其他简单的方法。