FastJson 配置

一 例子

package com.test.conf;
 
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
 
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
 
@Configuration
public class JsonConfig {
    /**
     * @Author anson
     * @Description 配置消息轉換器
     * @Date: 2019-12-8 11:23:33
     * @version: 1.0
     * new HttpMessageConverters(true, converters);
     * 一定要設爲true才能替換否則不會替換
     * @return 返回一個消息轉換的bean
     */
    @Bean
    public HttpMessageConverters fastJsonMessageConverters() {
        List<HttpMessageConverter<?>> converters = new ArrayList<>();
        //需要定義一個convert轉換消息的對象;
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        //添加fastJson的配置信息;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        //不過濾null值
        fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue);
        //全局時間配置
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        fastJsonConfig.setCharset(Charset.forName("UTF-8"));
        //處理中文亂碼問題
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        //在convert中添加配置信息.
        fastConverter.setSupportedMediaTypes(fastMediaTypes);
        fastConverter.setFastJsonConfig(fastJsonConfig);
 
        converters.add(0, fastConverter);
        return new HttpMessageConverters(converters);
    }
}

 

 

二 配置信息

名稱 含義
QuoteFieldNames 輸出key時是否使用雙引號,默認爲true    
UseSingleQuotes 使用單引號而不是雙引號,默認爲false
WriteMapNullValue 是否輸出值爲null的字段,默認爲false
WriteEnumUsingToString Enum輸出name()或者original,默認爲false     
UseISO8601DateFormat Date使用ISO8601格式輸出,默認爲false    
WriteNullListAsEmpty List字段如果爲null,輸出爲[],而非null     
WriteNullStringAsEmpty 字符類型字段如果爲null,輸出爲”“,而非null
WriteNullNumberAsZero 數值字段如果爲null,輸出爲0,而非null     
WriteNullBooleanAsFalse Boolean字段如果爲null,輸出爲false,而非null     
SkipTransientField 如果是true,類中的Get方法對應的Field是transient,序列化時將會被忽略。默認爲true
SortField 按字段名稱排序後輸出。默認爲false    
WriteTabAsSpecial 把\t做轉義輸出,默認爲false
PrettyFormat 結果是否格式化,默認爲false
WriteClassName 序列化時寫入類型信息,默認爲false。反序列化是需用到    
DisableCircularReferenceDetect 消除對同一對象循環引用的問題,默認爲false    
WriteSlashAsSpecial 對斜槓’/’進行轉義    
BrowserCompatible 將中文都會序列化爲\uXXXX格式,字節數會多一些,但是能兼容IE 6,默認爲false
WriteDateUseDateFormat 全局修改日期格式,默認爲false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
DisableCheckSpecialChar 一個對象的字符串屬性中如果有特殊字符如雙引號,將會在轉成json時帶有反斜槓轉移符。如果不需要轉義,可以使用這個屬性。默認爲false    
NotWriteRootClassName  不知道
BeanToArray 將對象轉爲array輸出    
WriteNonStringKeyAsString 不是String的字段寫爲String    
NotWriteDefaultValue 不設默認值     
BrowserSecure  不知道
IgnoreNonFieldGetter 忽略沒有getter方法的屬性
WriteEnumUsingName

目前版本的fastjson默認對enum對象使用WriteEnumUsingName屬性,因此會將enum值序列化爲其Name。
使用WriteEnumUsingToString方法可以序列化時將Enum轉換爲toString()的返回值;同時override toString函數能夠將enum值輸出需要的形式。但是這樣做會帶來一個問題,對應的反序列化使用的Enum的靜態方法valueof可能無法識別自行生成的toString(),導致反序列化出錯。
如果將節省enum序列化後的大小,可以將enum序列化其ordinal值,保存爲int類型。fastJson在反序列化時,如果值爲int,則能夠使用ordinal值匹配,找到合適的對象。
fastjson要將enum序列化爲ordinal只需要禁止WriteEnumUsingName feature。
首先根據默認的features排除WriteEnumUsingName,然後使用新的features序列化即可。

 




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