【问题标题】:How to use some Jackson Deserializer in own custom Deserializer?如何在自己的自定义反序列化器中使用一些杰克逊反序列化器?
【发布时间】:2017-12-08 15:18:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java json serialization jackson zoneddatetime


    【解决方案1】:

    @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。我只是更新答案,也许它可以解决你的问题。
    • 不工作。 ZonedDateTime zonedDateTime = mapper.readValue(date, ZonedDateTime.class);抛出错误
    • 什么异常?以及您使用的是哪个版本的 Jackson?它应该大于 2.8.5。根据我的演示,它应该可以工作。我只是用 maven 依赖更新答案
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 2015-12-09
      相关资源
      最近更新 更多