fastjson整合到spring boot中


fastjson集成到spring boot中,使用經驗

中文亂碼問題

private屬性問題

解決序列號字段順序問題

解決報錯:Request processing failed; nested exception is java.lang.IllegalArgumentException: Content-Type cannot contain wildcard type '*'



一、背景

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

JSON 的興起與崛起

除了json,我們常見的格式還有XML、yml等

JSON在前端JavaScript中應用得較多,內存中的對象可以使用json格式的字符串來表示自己的結構和數據,這稱之為序列化

而將json格式的字符串轉化為內存中的對象被稱之為反序列化

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



Java 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);

        // 高版本無需配置,低版本不配置報錯:Content-Type cannot contain wildcard type '*'
        // List<MediaType> fastMediaTypes = new ArrayList<>();
        // fastMediaTypes .add(MediaType.APPLICATION_JSON);
        // 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



3.2 private字段序列化問題

private修飾的字段如果沒有getter、setter則序列化不會顯示




end

相關文章:

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

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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM