首页 > 解决方案 > Jackson 可以解析不是 ISO-8601 的日期时间值吗?

问题描述

我试图让杰克逊解析我无法更改的特定 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”应该是正确的值。

到目前为止尝试过:

标签: javadatetimejackson

解决方案


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

推荐阅读