需求

前端反序列化对象到后端,如果前后端对其中某一个字段格式不统一,借助 @JsonDeserialize 注解统一格式。例如,数据库保存的时间是毫秒,前端需要展示的格式为 yyyy-MM-dd HH:mm:ss
序列化的时候在字段上面加上 @JsonSerialize 注解。

@JsonSerialize

  1. public class DateSerializer extends JsonSerializer<Long> {
  2. private DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  3. @Override
  4. public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers)
  5. throws IOException {
  6. LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(value), ZoneOffset.of("+8"));
  7. gen.writeString(df.format(localDateTime));
  8. }
  9. }

放在字段上面实现序列化的时候转换格式:

  1. @JsonSerialize(using = DateSerializer.class)
  2. private Long createTime;

@JsonDeserialize

反序列化和序列化差不多,实现的接口是 JsonDeserializer

  1. public class DateDeserializer extends JsonDeserializer<Long> {
  2. private static DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  3. @Override
  4. public Long deserialize(JsonParser p, DeserializationContext ctxt)
  5. throws IOException {
  6. if (!StringUtils.hasText(p.getText())) {
  7. return null;
  8. }
  9. return LocalDateTime.parse(p.getText(), df)
  10. .toInstant(ZoneOffset.of("+8"))
  11. .toEpochMilli();
  12. }
  13. }