1.异常信息
2.原因
默认情况下,fasterxml json只支持几种format,但是肯定不支持"yyyy-MM-dd HH:mm:ss"格式,所以就要自己指定date format了。
3.解决办法
a.创建一个类继承JsonDeserializer<Date>
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = jp.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
b.在实体类属性的set方法上进行注册
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
public void setDate(Date date) {
this.date = date;
}
在org.springframework.format.annotation包下
- import com.fasterxml.jackson.annotation.*;
- @JsonIgnoreProperties(ignoreUnknown = true)
- public class EmployeeProfile{
- private String name;
- private Integer age;
- @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
- private Date creation_date;
- }
jackson自定义接受多种日期格式类
/**
* 类说明:自定义jackson日期转换器,因为jackson内置支持转换的日期格式比较少
*/
public class CustomJsonDateDeserializer extends JsonDeserializer<Date>{
//添加不同的日期格式
private static List<String> formats = new ArrayList<String>();
static{
formats.add("yyyy");
formats.add("yyyy-MM");
formats.add("yyyy-MM-dd");
formats.add("yyyy-MM-dd HH:mm");
formats.add("yyyy-MM-dd HH:mm:ss");
formats.add("yyyy/MM");
formats.add("yyyy/MM/dd");
formats.add("yyyy/MM/dd HH:mm");
formats.add("yyyy/MM/dd HH:mm:ss");
}
@Override
public Date deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
String dateStr = jp.getText();
try {
if (dateStr.matches("^\\d{4}$")) {//2017
return parseDate(dateStr, formats.get(0));
} else if (dateStr.matches("^\\d{4}-\\d{1,2}$")) {//2017-09
return parseDate(dateStr, formats.get(1));
} else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {//2017-09-10
return parseDate(dateStr, formats.get(2));
} else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {//2017-09-10 21:15
return parseDate(dateStr, formats.get(3));
} else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {//2017-09-10 21:15:30
return parseDate(dateStr, formats.get(4));
} else if (dateStr.matches("^\\d{4}/\\d{1,2}$")) {//2017/09
return parseDate(dateStr, formats.get(5));
} else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2}$")) {//2017/09/10
return parseDate(dateStr, formats.get(6));
} else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {//2017/09/10 21:15
return parseDate(dateStr, formats.get(7));
} else if (dateStr.matches("^\\d{4}/\\d{1,2}/\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {//2017/09/10 21:15:30
return parseDate(dateStr, formats.get(8));
} else {
throw new BetException("在jackson自定义全局日期转换器,没有相对应的日期格式与传入的日期相匹配!!!");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 功能描述:格式化日期
*
* @param dateStr
* String 字符型日期
* @param format
* String 格式
* @return Date 日期
*/
public Date parseDate(String dateStr, String format) {
Date date=null;
SimpleDateFormat dateFormat = new SimpleDateFormat(format);
dateFormat.setLenient(false);//指定日期/时间解析为不严格
try {
date = (Date) dateFormat.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
} catch (Exception e1) {
e1.printStackTrace();
}
return date;
}