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

How to use some Jackson Deserializer in own custom Deserializer?

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

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

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

  1. 使用 ZonedDateTime 反序列化器进行反序列化(我发现实际上是自定义 InstantDeserializer
  2. 使用.toLocalDateTime和return它。

我该如何使用它? 一直想找,找不到。

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

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

而自定义解串器如下:

public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    @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();
    }
}

The demo can be accessed in github

Maven 依赖

<dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.8.9</version>
        </dependency>

    </dependencies>

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

我创建了一个示例 class,其中包含 LocalDateTime 字段:

public class ZoneToLocalTest {

    @JsonDeserialize(using = CustomZonedToLocalDeserializer.class)
    private LocalDateTime date;

    // getter and setter
}

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

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 class 中使用此格式(而不是使用 DateTimeFormatter.ISO_ZONED_DATE_TIME,您可以使用 DateTimeFormatter.ofPattern(pattern)).