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