Java 8 LocalDate Jackson格式

对于java.util.Date,当我这样做

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy") private Date dateOfBirth; 

然后在我发送JSON请求

 { {"dateOfBirth":"01/01/2000"} } 

有用。

我应该如何做到这一点Java 8的LocalDate字段?

我试过了

 @JsonDeserialize(using = LocalDateDeserializer.class) @JsonSerialize(using = LocalDateSerializer.class) private LocalDate dateOfBirth; 

它没有工作。

有人可以让我知道什么是正确的方法来做到这一点..

以下是依赖关系

 <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>jaxrs-api</artifactId> <version>3.0.9.Final</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>com.wordnik</groupId> <artifactId>swagger-annotations</artifactId> <version>1.3.10</version> </dependency> <dependency> 

我从来没有能够使用注释简单地工作。 为了使它工作,我为ObjectMapper创build了一个JSR310Module ,然后添加了JSR310Module以及一个更多的警告,这就是需要将write-date-as-timestamp设置为false。 有关JSR310模块的文档,请参阅更多内容 。 这是我使用的一个例子。

依赖

 <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.4.0</version> </dependency> 

注意:我遇到的一个问题是jackson-annotation版本被另一个依赖jsr310 ,使用版本2.3.2,它取消了jsr310所需的2.4 jsr310 发生了什么事情,我得到了一个N​​oClassDefFound的ObjectIdResolver ,这是一个2.4类。 所以我只需要排队包含的依赖版本

ContextResolver

 import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JSR310Module; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; @Provider public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> { private final ObjectMapper MAPPER; public ObjectMapperContextResolver() { MAPPER = new ObjectMapper(); MAPPER.registerModule(new JSR310Module()); MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); } @Override public ObjectMapper getContext(Class<?> type) { return MAPPER; } } 

资源类

 @Path("person") public class LocalDateResource { @GET @Produces(MediaType.APPLICATION_JSON) public Response getPerson() { Person person = new Person(); person.birthDate = LocalDate.now(); return Response.ok(person).build(); } @POST @Consumes(MediaType.APPLICATION_JSON) public Response createPerson(Person person) { return Response.ok( DateTimeFormatter.ISO_DATE.format(person.birthDate)).build(); } public static class Person { public LocalDate birthDate; } } 

testing

curl -v http://localhost:8080/api/person
结果: {"birthDate":"2015-03-01"}

curl -v -POST -H "Content-Type:application/json" -d "{\"birthDate\":\"2015-03-01\"}" http://localhost:8080/api/person
结果: 2015-03-01


有关JAXB解决scheme,另请参阅此处

UPDATE

JSR310Module从Jackson版本2.7 JSR310Module已弃用。 相反,你应该注册模块JavaTimeModule 。 它仍然是相同的依赖。

@JsonSerialize和@JsonDeserialize对我来说工作得很好。 它们消除了导入额外的jsr310模块的需要:

 @JsonDeserialize(using = LocalDateDeserializer.class) @JsonSerialize(using = LocalDateSerializer.class) private LocalDate dateOfBirth; 

解串器:

 public class LocalDateDeserializer extends StdDeserializer<LocalDate> { private static final long serialVersionUID = 1L; protected LocalDateDeserializer() { super(LocalDate.class); } @Override public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { return LocalDate.parse(jp.readValueAs(String.class)); } } 

串行:

 public class LocalDateSerializer extends StdSerializer<LocalDate> { private static final long serialVersionUID = 1L; public LocalDateSerializer(){ super(LocalDate.class); } @Override public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider sp) throws IOException, JsonProcessingException { gen.writeString(value.format(DateTimeFormatter.ISO_LOCAL_DATE)); } } 
  ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

对我来说工作得很好。

在春季启动web应用程序,与“jackson”和“jsr310”版本“2.8.5”

 compile "com.fasterxml.jackson.core:jackson-databind:2.8.5" runtime "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.5" 

'@JsonFormat'的作品:

 import com.fasterxml.jackson.annotation.JsonFormat; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private LocalDate birthDate;