SpringBoot默認Json解析框架jackson替換成fastjson,並使用全局日期格式化處理

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章