需求
前端反序列化对象到后端,如果前后端对其中某一个字段格式不统一,借助 @JsonDeserialize
注解统一格式。例如,数据库保存的时间是毫秒,前端需要展示的格式为 yyyy-MM-dd HH:mm:ss
。
序列化的时候在字段上面加上 @JsonSerialize
注解。
@JsonSerialize
public class DateSerializer extends JsonSerializer<Long> {
private DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(value), ZoneOffset.of("+8"));
gen.writeString(df.format(localDateTime));
}
}
放在字段上面实现序列化的时候转换格式:
@JsonSerialize(using = DateSerializer.class)
private Long createTime;
@JsonDeserialize
反序列化和序列化差不多,实现的接口是 JsonDeserializer
。
public class DateDeserializer extends JsonDeserializer<Long> {
private static DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public Long deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
if (!StringUtils.hasText(p.getText())) {
return null;
}
return LocalDateTime.parse(p.getText(), df)
.toInstant(ZoneOffset.of("+8"))
.toEpochMilli();
}
}