有没有用于 JDK8 java.time 的 Jackson 数据类型模块?

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

据我所知,Jackson 仍然是针对 JDK6编译的,因此不能直接使用这些类,必须像 Joda 所要求的那样将其构建为一个单独的模块。

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

110405 次浏览

我的错,我正在寻找一个 jackson-datatype-jdk8作为为 Jackson-datatype-jdk7,但是该项目实际上是创建在 JSR 名称 Jackson-datatype-jsr310

最完整的数据类型模块清单可以在 Github 的 Jackson“门户”页面上找到:

Https://github.com/fasterxml/jackson

其中列出了“ JSR-310: 支持“ Java8日期”。 命名有点不透明,但它指的是通过 JSR 完成的标准化过程,这个过程应该最终生成新的 Java8 Date API (如果还没有最终完成; 过程已经花了一段时间)。

直接联系方式是: https://github.com/FasterXML/jackson-datatype-jsr310

你只需要导入 Jsr310模块

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

如果在项目中没有启用 模块自动扫描模块自动扫描,则需要注册它:

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

如前所述,Jackson 数据类型 JSR310提供了对 Java8 Time 的支持。

自从 Jackson 2.6.0以来,“旧的”JSR310模块已经被废弃了。它被 JavaTimeModule 取代。Maven 依赖项是相同的(您可以在 玛文中心中找到当前版本) :

<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

GitHub 上的 JavaTimeModule 源代码

JavaTimeModule 的使用

如果您使用 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
[INFO] |  +- org.springframework.boot:spring-boot-starter-json:jar:2.0.0.M3:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.9.0.pr4:compile
[INFO] |  |  +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.9.0.pr4:compile

你应该能够使用

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