杰克逊映射器扩展LOCALDATE的
问题描述:
我们有一个LOCALDATE的定义的DTO:杰克逊映射器扩展LOCALDATE的
@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;
}
我们所有的杰克逊datababindm核心,jsr310在我们的pom.xml文件:
<!-- 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字符串:
“出生日期”:{ “年”:1964年, “月”: “二月”, “年表”:{ “calendarType” : “ISO8601”, “ID”: “ISO” }, “monthValue”:2, “请将dayOfMonth”:13, “一周中的某天”: “星期四”, “时代”: “CE”, “ dayOfYear“:44, ”leapYear“:true}
而不是:“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;
}
,并把它送到我的班,我需要它,而且工作。从不同的项目中获得效用并不适合我。
希望这可以帮助别人。
您是否使用JAX-RS及其实现之一? –
我在'pom.xml'中用这些依赖关系在一个新项目中试用了你的代码,它工作正常。如果我没有注册'JavaTimeModule',我只能看到你看到的输出。我建议你回顾一下你的项目中可能有的其他配置,或者包含'dob'字段的类中的其他注释 –
我们使用的是Spring-WS,而不是使用任何我知道的JAX-RS。 – tjholmes66