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在前端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序列化時,故意按字母排序,可能是為了速度的原因
一般來說不會影響使用
如果有排序需求,目前有幾種方法,按推薦程度由高到低
-
在類的每個欄位都加上註解
@JSONField(ordinal = 1)
這個是最實用的,見效快
-
來自GitHub issue,沒試驗過,程式碼看不懂...
JSON.DEFAULT_GENERATE_FEATURE &= ~SerializerFeature.SortField.getMask();
SerializeConfig serializeConfig = new SerializeConfig(true);
System.out.println(JSON.toJSONString(javaObject, serializeConfig));
end
相關文章:
《jndi ldap/rmi RCE介紹:fastjsion反序列化漏洞,log4j2命令執行》
《spring (boot)使用log4j2實現slf4j日誌門面》