1. 程式人生 > 其它 >fastjson整合到spring boot中

fastjson整合到spring boot中

fastjson整合到spring boot中,使用經驗

中文亂碼問題

序列號欄位順序問題



一、背景

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。
JSON是Douglas Crockford在2001年開始推廣使用的資料格式,在2005年-2006年正式成為主流的資料格式。

JSON 的興起與崛起

JSON在前端JavaScript中應用得較多,記憶體中的物件可以使用json格式的字串來表示自己的結構和資料,這稱之為序列化

而將json格式的字串轉化為記憶體中的物件被稱之為反序列化

因為前端使用較多,各種語言的後端也形成了自己的序列化、反序列化工具

spring boot預設使用jackson來序列、反序列化

效能測試對比資料來看,fastjson序列化較快,反序列化沒有明顯優勢

引入fastjson前博主習慣去掉jackson依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 去掉Jackson依賴 -->
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </exclusion>
    </exclusions>
</dependency>



二、fastjson整合到spring boot中

單純地引入依賴,只能在程式碼中主動地呼叫fastjson,整合到spring boot後,所有controller傳入的類和返回的類都會由fastjson來做反序列化和序列化

官方做法

個人喜歡寫配置類

@Configuration
public class WebConfig implements WebMvcConfigurer {
    // WebMvcConfigurerAdapter 這個類在SpringBoot2.0已過時,官方推薦直接實現WebMvcConfigurer 這個介面

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        //自定義配置...
        // 序列號欄位按字母排序
        // FastJsonConfig config = new FastJsonConfig();
        // config.set...
        // converter.setFastJsonConfig(config);

        // 網傳解決中文亂碼
        // List<MediaType> fastMediaTypes = new ArrayList<>();
        // fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        // converter.setSupportedMediaTypes(fastMediaTypes);

        converters.add(0, converter);
    }
}

FastJsonConfig中可以配置一些日期格式、迴圈引用等特性



三、一些使用問題

3.1 序列化欄位排序問題

jackson序列化出來json,其欄位順序和宣告順序一致

但是fastjson序列化時,故意按字母排序,可能是為了速度的原因

一般來說不會影響使用

如果有排序需求,目前有幾種方法,按推薦程度由高到低

  1. 在類的每個欄位都加上註解@JSONField(ordinal = 1)

    這個是最實用的,見效快

  2. 來自GitHub issue,沒試驗過,程式碼看不懂...

JSON.DEFAULT_GENERATE_FEATURE &= ~SerializerFeature.SortField.getMask();
SerializeConfig serializeConfig = new SerializeConfig(true);
System.out.println(JSON.toJSONString(javaObject, serializeConfig));
  1. 來自官方wiki

    單純使用這個配置似乎不可行,它可能要配合其他配置才能生效,參考issue #372 #1777




end

相關文章:

《jndi ldap/rmi RCE介紹:fastjsion反序列化漏洞,log4j2命令執行》

《spring (boot)使用log4j2實現slf4j日誌門面》