- 自定义注解
/**
* 字符串转Date
* * @author Lynn
* @date 2022/12/9 16:29
*/
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonDeserialize(using = StringToDateDeserializer.class)
public @interface ParseStringToDate {
String pattern() default "yyyy-MM-dd HH:mm:ss";
}
- 反序列化类
/**
* 反序列化时 将 '20200104112449' 转化为Date类型 可指定pattern
* * @author Lynn
* @date 2022/12/9 16:32
*/
@NoArgsConstructor
public class StringToDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
Class<?> clazz = jsonParser.getCurrentValue().getClass();
String dateStr = jsonParser.getValueAsString();
Field declaredField;
try {
declaredField = clazz.getDeclaredField(jsonParser.getCurrentName());
} catch (NoSuchFieldException e) {
return null;
}
ParseStringToDate annotation = declaredField.getAnnotation(ParseStringToDate.class);
if (Objects.isNull(annotation)) {
return null;
}
String pattern = annotation.pattern();
if (StringUtils.isNotBlank(dateStr)) {
try {
return new SimpleDateFormat(pattern).parse(dateStr);
} catch (ParseException e) {
return null;
}
}
return null;
}
}
这里是利用反射,获取注解里的属性. 注意, 获取field时, 如果字段起了别名, 是会获取不到的!
- 使用
/**
* 测量时间
*/
@ParseStringToDate(pattern = "yyyyMMddHHmmss")
private Date measureTime;