Jackson 映射器扩展了 LocalDate

Jackson mapper expands LocalDate

我们有一个用 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":{ "year": 1964, "month": "FEBRUARY", "chronology":{ "calendarType": "iso8601", "id": "ISO" }, "monthValue": 2, "dayOfMonth": 13, "dayOfWeek": "THURSDAY", "era": "CE", "dayOfYear": 44, "leapYear":正确}

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

所以,我不确定我是怎么做到的?
我想确保日期写得正确,这样我就可以重新解析回 LocalDate。或者,有没有一种方法可以将现有的 JSON(扩展)解析回 LocalDate?

谢谢!

原来这是一个 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;
}

并将它直接带到我的 class 我需要它的地方,并且成功了。从不同的项目接触实用程序对我不起作用。

希望这对其他人有帮助。

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