杰克逊映射器扩展了LocalDate

时间:2017-06-02 19:21:28

标签: json java-8 jackson-modules jackson2

我们使用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年,       “月”:“2月”,       “年表”:{           “calendarType”:“iso8601”,           “id”:“ISO”       },       “monthValue”:2,       “dayOfMonth”:13,       “dayOfWeek”:“星期四”,       “时代”:“CE”,        “dayOfYear”:44,        “leapYear”:true}

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

所以,我不确定我是怎么做到的? 我想确保日期写得正确,所以我可以重新解析回LocalDate。或者,有没有办法可以使用现有的JSON(扩展)并将其解析回LocalDate?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

并把它带到了我需要它的班级,这很有效。从一个不同的项目到达一个实用程序并不适合我。

希望这有助于其他人。

答案 1 :(得分:1)

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