【问题标题】:Can Jackson parse date-time values which aren't ISO-8601?Jackson 可以解析不是 ISO-8601 的日期时间值吗?
【发布时间】:2019-10-24 08:44:00
【问题描述】:

我正试图让 Jackson 解析由我无法更改的特定 API 提供给我的日期时间值。

所以我给它一个自定义模式:

public class Problem {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());

        String json = "{\"posted_at\":\"Mon, 14 Oct 2019 13:00:00 +0900\"}";
        Model model = mapper.readValue(json, Model.class);
        System.out.println(model.posted_at);
    }

    public static class Model {
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "E, d MMM yyyy HH:mm:ss XX")
        public ZonedDateTime posted_at;
    }
}

我得到了这个例外:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'Mon, 14 Oct 2019 13:00:00 +0900' could not be parsed at index 0

它似乎在索引 0 处失败,但我不明白为什么,因为对于星期格式模式“E”,“Mon”似乎应该是正确的值。

到目前为止尝试过:

  • 设置DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE:

    mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false)
    

    结果:同样的异常。

  • 添加Jdk8Module:

    ObjectMapper mapper = new ObjectMapper()
       .registerModule(new Jdk8Module())
       .registerModule(new JavaTimeModule()); 
    

    结果:同样的异常。

【问题讨论】:

    标签: java datetime jackson


    【解决方案1】:

    Jackson 与 Joda DateTime 合作了很长时间,从您的错误消息看来,您正在使用 Java.DateTime 添加对 Java dateTime 的支持,您需要添加一些额外的依赖项 "jackson-datatype-jdk8" 见https://github.com/FasterXML/jackson-modules-java8

    <dependency>
     <groupId>com.fasterxml.jackson.datatype</groupId>
     <artifactId>jackson-datatype-jdk8</artifactId> 
    </dependency>
    

    然后你设置ADJUST_DATES_TO_CONTEXT_TIME_ZONE

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false)
    

    然后添加新模块

    // Up to Jackson 2.9: (but not with 3.0)
    ObjectMapper mapper = new ObjectMapper()
       .registerModule(new Jdk8Module())
       .registerModule(new JavaTimeModule()); 
    

    【讨论】:

    • 所以...上面我已经在使用 JavaTimeModule。但我使用的是 jackson-datatype-jsr310 而不是 jackson-datatype-jdk8。如果我改为使用 jackson-datatype-jdk8,那么我再也找不到 JavaTimeModule,所以我假设我需要两者。现在我找到了两个类,但我仍然得到同样的错误。但是 ParameterNamesModule 是什么,我从哪里得到它?
    • 可以忽略新的ParameterNamesModule(),主要是JDK8Module和JavaTimeModule。您也可以尝试调整: ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);
    • 同样的例外,在尝试 ADJUST_DATES_TO_CONTEXT_TIME_ZONE 之后
    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多