JDK8 java.time 是不是有杰克逊数据类型模块?

Posted

技术标签:

【中文标题】JDK8 java.time 是不是有杰克逊数据类型模块?【英文标题】:Is there a jackson datatype module for JDK8 java.time?JDK8 java.time 是否有杰克逊数据类型模块? 【发布时间】:2014-02-18 12:36:30 【问题描述】:

我正在为新的JDK8 java.time 类寻找一个模块。我查看了FasterXML GitHub Project Listing,目前没有找到。

据我了解,Jackson 仍在针对 JDK6 进行编译,因此无法直接使用这些类,并且必须按照 Joda 的要求将其构建为单独的模块。

我不介意开始这个项目,不过我想看看是否已经在进行其他努力。

【问题讨论】:

【参考方案1】:

我的错,我一直在寻找 jackson-datatype-jdk8 和 jackson-datatype-jdk7,但是该项目实际上是在 JSR 名称 jackson-datatype-jsr310 下创建的。

【讨论】:

【参考方案2】:

最完整的数据类型模块列表可以从 Github 的 Jackson“门户”页面找到:

https://github.com/FasterXML/jackson

其中列出了“JSR-310:对“Java 8 Dates”的支持。 命名有点不透明,但它指的是标准化过程,通过 JSR 应该最终确定以生成新的 Java8 Date API(如果它还不是最终的;过程需要一段时间)。

直接链接是:https://github.com/FasterXML/jackson-datatype-jsr310

【讨论】:

谢谢,我确实在发布问题后立即找到了它。 请注意,您还必须注册模块,例如:` private static final ObjectMapper jsonMapper = new ObjectMapper().findAndRegisterModules();`【参考方案3】:

您只需要导入jsr310 module。

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.5.0</version>
</dependency>

如果您的项目中没有启用module auto scan,则需要注册它:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JSR310Module());

【讨论】:

【参考方案4】:

如前所述,Jackson-Datatype-JSR310 提供对 Java 8 Time 的支持。

自 Jackson 2.6.0 起,“旧”JSR310Module 已被弃用。它被JavaTimeModule 取代。 Maven依赖是一样的(可以在Maven Central找到当前版本):

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.6.0</version>
</dependency>

你必须像这样注册模块:

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

或者像这样:

ObjectMapper mapper = new ObjectMapper(); 
mapper.findAndRegisterModules();

或者像这样(从 2.10 开始可能):

ObjectMapper mapper = JsonMapper.builder()
        .findAndAddModules()
        .build();

请注意,从 2.6 开始,此模块不支持自动注册,因为存在旧版本 JSR310Module。旧版具有相同的功能,但默认配置略有不同:请参阅 com.fasterxml.jackson.datatype.jsr310.JSR310Module 了解详细信息。

JavaTimeModule Source at GitHub

JavaTimeModule Usage

【讨论】:

特别有用的答案,因为它提到了名称更改,以及关于自动注册的额外警告。【参考方案5】:

如果您使用 Spring Boot 2 并依赖于 spring-boot-starter-web 启动器,您将同时拥有以下依赖项:不推荐使用的 (jackson-datatype-jsr310) 和实际的 (jackson-datatype-jdk8)。

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.0.0.M3:compile
[信息] | +- org.springframework.boot:spring-boot-starter-json:jar:2.0.0.M3:compile
[信息] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.9.0.pr4:compile
[信息] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.9.0.pr4:compile

【讨论】:

嗨,大卫,阅读你的答案的好日子,我有同样的问题,我试图解决它:D 我得到了java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonCreator$Mode 我只在 Intellij 配置中检查 Include dependencies with "Provided Scope" 解决了我的问题:D 你好 Youcef。那对我来说也是阅读你的好日子:) IntelliJ,我们的技能:) 最后你是如何解决这个问题的? :) 嗨,David,是的,正如我所说,我刚刚检查了 Edit Configuration > Include dependencies with "Provided Scope" 解决了这个问题 ;) 哦,是的,Youcef:“检查”用于标记,而不是“检查”用于验证:)【参考方案6】:

你应该可以使用

ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();

【讨论】:

以上是关于JDK8 java.time 是不是有杰克逊数据类型模块?的主要内容,如果未能解决你的问题,请参考以下文章

Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点

Java日期时间API系列20-----Jdk8中java.time包中的新的日期时间API类,ZoneId时区ID大全等。

Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate

Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date

Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等

Day028 JDK8中新日期和时间API