@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的实例:抽象类型需要映射到具体类型,具有自定义反序列化器或包含其他类型信息
最佳答案
退后一步
我特别想知道为什么要同时使用LocalDateTime
和ZoneId
。仅使用ZonedDateTime
会更容易吗?
在设计方面,ZonedDateTime
是LocalDateTime
和ZoneId
的组合。
支持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:ZoneId
和ZoneOffset
,它们实际上并不存储日期和时间,但仍受该模块支持。