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);
我们有一个用 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);