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

时间:2017-07-05 05:58:12

标签: java json serialization jackson zoneddatetime

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

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

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

  1. 使用LocalDateTime反序列化器进行反序列化(我发现,实际上是自定义ZonedDateTime
  2. 使用InstantDeserializer并将其返回。
  3. 我该如何使用它? 试图找到它,但我不能。

2 个答案:

答案 0 :(得分:2)

@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>

答案 1 :(得分:1)

如果您的输入代表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))。