4

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

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

基本上我想在我的反序列化器中做的是:

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

我该如何使用它?试图找到它,但我找不到。

4

2 回答 2

4

@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();
    }
}

可以在github中访问demo

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>
于 2017-07-05T09:46:18.483 回答
1

如果您的输入代表 aZonedDateTime并且您想将其转换为 a 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);
    }
}

我已经使用 input 进行了测试,2017-07-05T14:10:45.432+01:00[Europe/London]结果是LocalDateTime带有 value 2017-07-05T14:10:45.432

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

于 2017-07-05T13:19:37.770 回答