杰克逊映射器扩展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?

谢谢!

+0

您是否使用JAX-RS及其实现之一? –

+0

我在'pom.xml'中用这些依赖关系在一个新项目中试用了你的代码,它工作正常。如果我没有注册'JavaTimeModule',我只能看到你看到的输出。我建议你回顾一下你的项目中可能有的其他配置,或者包含'dob'字段的类中的其他注释 –

+0

我们使用的是Spring-WS,而不是使用任何我知道的JAX-RS。 – tjholmes66

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

,并把它送到我的班,我需要它,而且工作。从不同的项目中获得效用并不适合我。

希望这可以帮助别人。