如何在自定义反序列化器中使用一些Jackson Deserializer?
我正在努力解决问题中提到的问题。
我需要创建一些自定义反序列化器,它或多或少是标准反序列化器的类型转换(原因是ZonedDateTime
适用于我的输入,但我不想将类型更改为ZonedDateTime
,但保留LocalDateTime
)。
基本上我想在我的解串器中做的是:
- 使用
ZonedDateTime
反序列化器反序列化(我发现,实际上是自定义的InstantDeserializer
) - 使用
.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