【问题标题】:Jackson mapper expands LocalDateJackson 映射器扩展 LocalDate
【发布时间】:2017-11-04 06:51:39
【问题描述】:

我们有一个使用 LocalDate 定义的 DTO:

@JsonProperty("dob")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate dob;

我们有一个 ObjectMapper 定义如下的代码:

private static final ObjectMapper makeMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new ParameterNamesModule());
    mapper.registerModule(new Jdk8Module());
    mapper.registerModule(new JavaTimeModule());
    return mapper;
}

我们的 pom.xml 文件中包含所有 jackson-datababindm 核心、jsr310:

    <!-- Jackson JSON Mapping -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-parameter-names</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jdk8</artifactId>
        <version>2.8.8</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.8.8</version>
    </dependency>

所以,当我将我的对象转换为 JSON 字符串时:

    String json = makeMapper().writeValueAsString(myobject);

dob 将 JSON 字符串写入为:

"dob":{ “年”:1964年, “月”:“二月”, “年表”:{ “日历类型”:“iso8601”, “id”:“ISO” }, “月值”:2, "dayOfMonth": 13, "dayOfWeek": "星期四", “时代”:“CE”, "dayOfYear": 44, “闰年”:真}

而不是:"dob":"1964-02-13" 这是正确的。

所以,我不确定我是如何做到这一点的?
我想确保写出的日期是正确的,所以我可以重新解析回 LocalDate。或者,有没有办法可以获取现有的 JSON(扩展)并将其解析回 LocalDate?

谢谢!

【问题讨论】:

  • 您在使用 JAX-RS 及其实现之一吗?
  • 我在 pom.xml 中使用这些依赖项在一个新项目中试用了您的代码,它运行良好。如果我没有注册JavaTimeModule,我只能看到你看到的输出。我建议您查看项目中可能包含的其他配置或包含dob 字段的类中的其他注释
  • 我们使用的是 Spring-WS,而不是我知道的任何 JAX-RS。
  • 我们绝对是在将 JavaTimeModule 添加到我们的 ObjectMapper 中。定义和我们上面描述的一样。我一定会继续调查的。

标签: json java-8 jackson-modules jackson2


【解决方案1】:

原来这是一个 ClassLoader 问题。在最小的情况下,代码可以正常工作,并且 LocalDate 会相应地转换为 JSON。当您将一个项目嵌入到另一个项目中时,会发生 ObjectMapper 是在没有 JavaTimeModule 的情况下在其他地方定义的。

我拿了代码:

private static final ObjectMapper makeMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new ParameterNamesModule());
    mapper.registerModule(new Jdk8Module());
    mapper.registerModule(new JavaTimeModule());
    return mapper;
}

并把它带到我需要它的课堂上,这很奏效。从其他项目联系实用程序对我不起作用。

希望这对其他人有所帮助。

【讨论】:

    【解决方案2】:

    com.fasterxml.jackson.core:jackson-databind:2.9.7 内可以使用以下代码实现LocalDate 解决方法:

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    objectMapper.registerModule(new JavaTimeModule());
    String expectedJson = objectMapper.writeValueAsString(dataVersions);
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2016-12-28
      • 2021-02-06
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多