默认的状况下,Jackson序列化/反序列化 Java8 新增的时间类型不会序列化成字符串或者时间戳,由于没有相对应的序列化策略,因此咱们能够本身来配置对象的序列化跟反序列化策略,也能够引用jackson-datatype-jsr310的jar包来进行处理,下面咱们以LocalDateTime做为示例java
在项目内,咱们引用下依赖app
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.8.11</version> </dependency>
默认的状况下,JSR310给咱们提供了转换成字符串的序列化/反序列化类,分别是LocalDateTimeSerializer
/LocalDateTimeDeserializer
,咱们能够使用已经有的实现,来进行序列化ide
咱们往Jackson的ObjectMapper内注册一个JSR310提供的JavaTimeModule模块,JavaTimeModule内,咱们须要配置LocalDateTime的的序列化策略,具体代码以下code
ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) .addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); objectMapper.registerModule(javaTimeModule);
此次,咱们自定义转换成秒级的时间戳,Jackson提供了JsonDeserializer跟JsonSerializer两个抽象类,以上两个分别是反序列化跟序列化的父类,咱们继承它而且实现抽象方法,具体代码以下orm
public class InstantSerializer extends JsonSerializer<LocalDateTime> { @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { gen.writeNumber(DateUtils.toSecond(value)); } } public class InstantDeserializer extends JsonDeserializer<LocalDateTime> { @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext txt) throws IOException, JsonProcessingException { return Instant.ofEpochSecond(p.getLongValue()).atZone(ZoneId.systemDefault()).toLocalDateTime(); } }
将定义的序列化规格,注册到ObjectMapper里面去xml
ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new InstantSerializer()) .addDeserializer(LocalDateTime.class,new InstantDeserializer()); objectMapper.registerModule(javaTimeModule);
到此,咱们大概介绍了两种配置的方法,一种是jsr310已经提供的,另一种是经过继承jackson提供的抽象类,本身进行实现,二者实现上差很少,不过经过继承更灵活,更可控,使用jsr310更方便,具体的使用就仁者见仁智者见智了对象