@JsonDeserialize 和 @JsonSerialize 基本使用 介绍的博客比较多:
https://blog.csdn.net/yage124/article/details/107321339/https://blog.csdn.net/yage124/article/details/107321339/https://www.h5w3.com/249702.htmlhttps://www.h5w3.com/249702.html上面是两种常见的反序列化。
现在的情况是:
前端传递的是字符串集合,后端接收的是集合中的类:
前端传递参数:
{ "applyTimeSection": ["2020-02-19 08:11:11","2020-02-19 08:20:11"] }
后端接收:
private List<Date> applyTimeSection;
通过一些基础使用我们知道 使用@JsonDeserialize反反序列化,需要实现自定义反序列化类。
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.springframework.util.ObjectUtils;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/**
* 将List<Sting> 转换为 List<Date>
*/
public class Strings2Dates extends JsonDeserializer<List<Date>> {
@Override
public List<Date> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
if (ObjectUtils.isEmpty(p)) {
return Collections.emptyList();
}
// 对于集合类型getText()方法是不行的
// p.getText()
// 此处是重点:VO对应的属性是什么类型,此处的参数就什么类型
List<String> list = p.readValueAs(List.class);
List<Date> dates = new ArrayList<>();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
for (String date : list) {
LocalDateTime parse = LocalDateTime.parse(date, dateTimeFormatter);
Instant instant = parse.toInstant(ZoneOffset.ofHours(8));
dates.add(Date.from(instant));
}
return dates;
}
}
定义了反序列化类,此时我们就可以在VO对应的属性的setter方法上添加注解即可。
@JsonDeserialize(using = Strings2Dates.class)
public void setApplyTimeSelection(List<Date> applyTimeSelection) {
this.applyTimeSelection = applyTimeSelection;
}