@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
private LocalDateTime accessStart;

private ZoneId accessStartZoneId;


Jackson中是否有内置的模式映射器来映射包含Java ZoneId的JSON请求?

{
  "accessStart": "2017-10-10T10:10:10.100",
  "accessStartZoneID": "Australia/Sydney"
}


我正在使用Spring Boot 1.5.4.RELEASE。如何为ZoneId配置解串器?与accessStart一起使用时效果很好


JSON解析错误:无法构造java.time.ZoneId的实例:抽象类型需要映射到具体类型,具有自定义反序列化器或包含其他类型信息

最佳答案

退后一步

我特别想知道为什么要同时使用LocalDateTimeZoneId。仅使用ZonedDateTime会更容易吗?

在设计方面,ZonedDateTimeLocalDateTimeZoneId的组合。

支持ZoneId

假设您仍要使用ZoneId,则可以编写自己的自定义(反)序列化器。

或者,您可以将jackson-datatype-jsr310工件添加到您的依赖项中:

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


然后在您的JavaTimeModule中注册ObjectMapper模块:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());


在Spring Boot应用程序中,您需要以下内容:

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper createObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return mapper;
    }
}


ZoneId支持documentation



ZoneIdZoneOffset,它们实际上并不存储日期和时间,但仍受该模块支持。

10-07 19:10