如何在自定义反序列化器中使用一些Jackson Deserializer?

我正在努力解决问题中提到的问题。

我需要创建一些自定义反序列化器,它或多或少是标准反序列化器的类型转换(原因是ZonedDateTime适用于我的输入,但我不想将类型更改为ZonedDateTime ,但保留LocalDateTime )。

基本上我想在我的解串器中做的是:

  1. 使用ZonedDateTime反序列化器反序列化(我发现,实际上是自定义的InstantDeserializer
  2. 使用.toLocalDateTime并返回它。

我怎么用呢? 试图找到它,但我不能。

如果您的输入表示ZonedDateTime并且您想将其转换为LocalDateTime ,则可以执行以下操作。

我创建了一个带有LocalDateTime字段的示例类:

 public class ZoneToLocalTest { @JsonDeserialize(using = CustomZonedToLocalDeserializer.class) private LocalDateTime date; // getter and setter } 

并且还创建了反序列化器类:

 public class CustomZonedToLocalDeserializer extends LocalDateTimeDeserializer { public CustomZonedToLocalDeserializer() { super(DateTimeFormatter.ISO_ZONED_DATE_TIME); } } 

我已经测试了输入2017-07-05T14:10:45.432+01:00[Europe/London] ,结果是一个LocalDateTime ,其值为2017-07-05T14:10:45.432

如果输入的格式不同,则需要在CustomZonedToLocalDeserializer类中使用此格式(而不是使用DateTimeFormatter.ISO_ZONED_DATE_TIME ,您将使用DateTimeFormatter.ofPattern(pattern) )。

@JsonDeserialize用于表示使用自定义反序列化器

 public class Event { public String name; @JsonDeserialize(using = LocalDateTimeDeserializer.class) private LocalDateTime date; } 

自定义解串器如下:

 public class LocalDateTimeDeserializer extends JsonDeserializer { @Override public LocalDateTime deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException, JsonProcessingException { String date = jsonparser.getText(); JavaTimeModule javaTimeModule = new JavaTimeModule(); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(javaTimeModule); ZonedDateTime zonedDateTime = mapper.readValue(date, ZonedDateTime.class); return zonedDateTime.toLocalDateTime(); } } 

可以在github中访问该演示

Maven依赖

   com.fasterxml.jackson.core jackson-core 2.8.5   com.fasterxml.jackson.core jackson-annotations 2.8.5   com.fasterxml.jackson.core jackson-databind 2.8.5    commons-io commons-io 2.5    com.fasterxml.jackson.datatype jackson-datatype-jsr310 2.8.9