SpringBoot默認Json解析框架jackson替換成fastjson,並使用全局日期格式化處理
1. 引入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
1.1編寫配置類替換json解析
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 利用fastjson替換掉jackson,且解決中文亂碼問題
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//1.構建了一個HttpMessageConverter FastJson 消息轉換器
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2.定義一個配置,設置編碼方式,和格式化的形式
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//3.設置成了PrettyFormat格式
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//4.處理中文亂碼問題
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
//5.全局json請求日期反序列化 -->LocalDateTime
ParserConfig parserConfig = new ParserConfig();
parserConfig.putDeserializer(LocalDateTime.class,new MyLocalDateTimeDeserializer());
fastJsonConfig.setParserConfig(parserConfig);
//6.全局json響應日期序列化 -->LocalDateTime
SerializeConfig serializeConfig = new SerializeConfig();
serializeConfig.put(LocalDateTime.class,new MyLocalDateTimeSerializer("yyyy-MM-dd HH:mm:ss"));
fastJsonConfig.setSerializeConfig(serializeConfig);
//7.將fastJsonConfig加到消息轉換器中
fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);
}
}
1.2 編寫MyLocalDateTimeSerializer
/**
* @Author: zhihao
* @Date: 2020/4/15 17:48
* @Description: json響應 將日期字符串序列化爲定製日期字符串響應
* @Versions 1.0
**/
public class MyLocalDateTimeSerializer extends SimpleDateFormatSerializer {
private final String pattern;
public MyLocalDateTimeSerializer(String pattern) {
super(pattern);
this.pattern = pattern;
}
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
if (object == null) {
serializer.out.writeNull();
return;
}
if (object instanceof LocalDateTime){
LocalDateTime localDateTime = (LocalDateTime) object;
String format = localDateTime.format(DateTimeFormatter.ofPattern(pattern));
serializer.write(format);
}
}
}
1.3 編寫MyLocalDateTimeDeserializer
/**
* @Author: zhihao
* @Date: 2020/4/15 17:08
* @Description: json請求 將日期字符串反序列化爲綁定到@requestBody對象上
* @Versions 1.0
**/
public class MyLocalDateTimeDeserializer extends AbstractDateDeserializer {
private static final String YYYY_MM_DD = "yyyy-MM-dd";
private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
@Override
protected <T> T cast(DefaultJSONParser parser, Type clazz, Object fieldName, Object value) {
String dateStr = null;
if (value instanceof String){
dateStr = ((String) value);
}else if (StringUtils.isBlank(dateStr)){
return null;
}
//去前後空格
dateStr = dateStr.trim();
//判斷是否yyyy-MM-dd格式
if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
//yyyy-MM-dd 會構建成yyyy-MM-dd 00:00:00
return (T) LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(YYYY_MM_DD)).atStartOfDay();
//判斷是否yyyy-MM-dd HH:mm:ss格式
} else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
return (T) LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS));
} else {
//都不匹配說明請求格式不正確
throw new DateTimeException("Date Format IsWrong :" + dateStr);
}
}
@Override
public int getFastMatchToken() {
return JSONToken.LITERAL_STRING;
}
}
到此配置完成,自己測試過了, 可能有並不完善, 自己項目用的是
jackson
。