我们使用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?
谢谢!
答案 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);