須要自定義Jackson序列化和反序列化有兩種方式,一種是全局定義,一種是非全局定義。先來看看全局定義。全局定義的步驟以下,以定義一個localDateTime的序列化和反序列化爲例:json
建立一個序列化類而後繼承JsonSerializer,重寫serialize序列化方法。其中第一個參數localDateTime爲JsonSerializer的泛型,表示的是被序列化的類型的值,第二個參數jsonGenerator表示的是用於輸出生成的Json內容,第三個參數暫時沒明白什麼應用場景。重寫方法通常是將想要序列化的字符串傳入 jsonGenerator.writeString。app
public final class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> { public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer(); public LocalDateTimeSerializer() { } @Override public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { jsonGenerator.writeString(DateUtil.format(localDateTime, DateUtil.DateTimeFormatEnum.DATE_TIME_FORMAT_4)); } }
建立兩個類,一個類繼承JsonDeserializer,一個類繼承KeyDeserializer,重寫deserialize反序列化方法。參數jsonParser用於讀取json內容的解析,deserializationContext可用於訪問此有關反序列化的上下文(暫時也不知道怎麼用),返回值則是JsonDeserializer的泛型對象,表示要反序列化的對象。通常用法是經過jsonParser.getText().trim()獲取該字段json字符串,而後將該字符串轉換爲對象返回。ide
public final class LocalTimeDeserializer extends JsonDeserializer<LocalTime> { public static final LocalTimeDeserializer INSTANCE = new LocalTimeDeserializer(); public LocalTimeDeserializer() { } @Override public LocalTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { String text = jsonParser.getText().trim(); return LocalTime.parse(text, DateUtil.DATE_TIME_FORMATTER_6); } }
public final class LocalDateTimeKeyDeserializer extends KeyDeserializer { public static final LocalDateTimeKeyDeserializer INSTANCE = new LocalDateTimeKeyDeserializer(); public LocalDateTimeKeyDeserializer() { } @Override public Object deserializeKey(String s, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { return StringUtils.isBlank(s) ? null : LocalDateTime.parse(s, DateUtil.DATE_TIME_FORMATTER_4); } }
@Bean public ObjectMapper objectMapper(){ ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); //不註釋,會致使swagger報錯 //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //關閉日期序列化爲時間戳的功能 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); //關閉序列化的時候沒有爲屬性找到getter方法,報錯 objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); //關閉反序列化的時候,沒有找到屬性的setter報錯 objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); //序列化的時候序列對象的全部屬性 objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); //反序列化的時候若是多了其餘屬性,不拋出異常 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //若是是空對象的時候,不拋異常 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); SimpleModule simpleModule = new SimpleModule(); //json值序列化 simpleModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE); //json值反序列化 simpleModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); //json鍵序列化 simpleModule.addKeySerializer(LocalDateTime.class,LocalDateTimeSerializer.INSTANCE); //json鍵反序列化 simpleModule.addKeyDeserializer(LocalDateTime.class, LocalDateTimeKeyDeserializer.INSTANCE); objectMapper.registerModule(simpleModule); return objectMapper; }
以上,經過objectMapper的配置,完成了全局序列化、反序列化的配置,若是不須要全局則經過@jsonserialize或 @JsonDeserialize指定使用的序列化、反序列化類。code