本文目錄一覽:
- 1、SpringCloud使用FastJsonHttpMessageConverter遇到的坑
- 2、為什麼springmvc中都用jackson而不用fastjson
- 3、Jackson和FastJson性能誰更快
- 4、idea為什麼拉了fastjson包卻使用不了
- 5、代碼中的命名均不能以下劃線或美元符號開為什麼
- 6、Gson、FastJson、Jackson、json-lib對比總結
SpringCloud使用FastJsonHttpMessageConverter遇到的坑
1.序列化到前台時時間變成時間戳,沒有時間格式,SpringBoot自帶的配置時間序列化格式因為已經被替換了實現類所以不在生效,需要使用fastJson的時間設置方式@JSONField(format =”yyyy-MM-dd HH:mm:ss”)在實體類上加上次註解即可。
2.在序列話到前台時候fastjson遍歷集合會存在對象被返回的情況,以及所有請求被攔截,但是處理不是很理想的情況,貼出配置供參考
FastJsonHttpMessageConverterCustomextends 當作一個Bean註冊
public class FastJsonHttpMessageConverterCustomextends FastJsonHttpMessageConverter {
private static SetsupportedMediaTypes;
public FastJsonHttpMessageConverterCustom() {
supportedMediaTypes =new HashSet();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
}
@Override
public boolean canRead(Type type, Class contextClass, MediaType mediaType) {
return this.supports(contextClass) supportedMediaTypes.contains(mediaType);
}
@Override
public boolean canWrite(Type type, Class clazz, MediaType mediaType) {
return super.supports(clazz) supportedMediaTypes.contains(mediaType);
}
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException {
OutputStream out = outputMessage.getBody();
String text = JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
byte[] bytes = text.getBytes(“utf-8”);
out.write(bytes);
}
}
為什麼springmvc中都用jackson而不用fastjson
這是spring默認的,你也可以重寫,用fastjson代替
jackson,事實上fastjson確實比
jackson快一些。而且不會發現自包含類型數據的轉換錯誤。
Jackson和FastJson性能誰更快
Fastjson快,但是和jackson 的差距不大,優勢並沒有太明顯。Jackson還可以加上AfterBurner來使用byte generation,這樣和Fastjson的差距就更小了。
除了速度勝出外,Fastjson相比較 Jackson 有不少短板。
1. 可定製性
Jackson有靈活的API,可以很容易進行擴展和定製,而且很多時候需要的模塊都已經有人提供了。比如guava中定義的數據類型,比如kotlin語言Immutable的類型等,比如java8 引入的新日期時間類型和Optional都已經有支持的模塊。
FastJson只有一個(簡陋)的SerializeFilter機制用來定製序列化,ParseProcess機制用來定製反序列化,每次調用序列化/反序列化的的時候都要自己傳filter或者Process這個參數過去,Jackson和 Gson都是直接註冊模塊就可以了,Jackson還可以使用SPI來自動發現和註冊模塊。
2. 代碼質量
公司有一些項目使用了fastjson,在使用fastjson的項目裡面碰到的兩個低級bug:
1. 碰到在128~255 的字符直接異常,這些主要是西歐語言的字符,因為他用一個數組來記錄 轉義後的字符表示,但是數組長度只有128…
2. 內存佔用過多。Fastjson為了性能,在ThreadLocal中緩存了char[] buffer,這樣避免分配內存和gc的開銷。但是如果碰到了大的json(比如10M這樣的),就會佔用大量的內存,而且以後都是處理小json了內存佔用也回不來。
這些問題雖然後來的版本都修復了,但是也反映出Fastjson代碼質量上要求不夠嚴格。 而Jackson這麼多年來使用上還沒有碰到過這樣的Bug.
3. 文檔
英文文檔缺乏已有的也不規範,相比較國內用戶還多些。
idea為什麼拉了fastjson包卻使用不了
JSON.toJSONString(o,SerializerFeature.DisableCircularReferenceDetect);解決方法~默認fastjson是打開索引引用的。如果是null對象,或者對象多特定情況下,引用就會出$ref等字眼。解決方法,關閉索引。
代碼中的命名均不能以下劃線或美元符號開為什麼
因為阿里自研的fastjson對_和$開頭的變量序列化bug太多,而jackson,gson就沒這些問題
Gson、FastJson、Jackson、json-lib對比總結
綜上4種Json技術的比較: 在項目選型的時候可以使用Google的Gson和阿里巴巴的FastJson兩種並行使用,
如果只是功能要求,沒有性能要求,可以使用google的Gson,
如果有性能上面的要求可以使用Gson將bean轉換json確保數據的正確,使用FastJson將Json轉換Bean
2.1 主要類介紹
Gson類:解析json的最基礎的工具類
JsonParser類:解析器來解析JSON到JsonElements的解析樹
JsonElement類:一個類代表的JSON元素
JsonObject類:JSON對象類型
JsonArray類:JsonObject數組
TypeToken類:用於創建type,比如泛型List?
2.2 maven依賴
2.3 bean轉換json
2.4 json轉換bean
2.5 json轉換複雜的bean,比如List,Set
將json轉換成複雜類型的bean,需要使用TypeToken
2.6 通過json對象直接操作json以及一些json的工具
a) 格式化Json
b) 判斷字符串是否是json,通過捕捉的異常來判斷是否是json
c) 從json串中獲取屬性
d) 除去json中的某個屬性
e) 向json中添加屬性
f) 修改json中的屬性
g) 判斷json中是否有屬性
h) json中日期格式的處理
然後使用gson對象進行json的處理,如果出現日期Date類的對象,就會按照設置的格式進行處理
i) json中對於Html的轉義
這種對象默認對Html進行轉義,如果不想轉義使用下面的方法
3.1 maven依賴
3.2 基礎轉換類
同上
3.3 bean轉換json
將對象轉換成格式化的json
將對象轉換成非格式化的json
obj設計對象
對於複雜類型的轉換,對於重複的引用在轉成json串後在json串中出現引用的字符,比如 [0].books[1]
3.4 json轉換bean
3.5 json轉換複雜的bean,比如List,Map
3.6 通過json對象直接操作json
a) 從json串中獲取屬性
b) 除去json中的某個屬性
c) 向json中添加屬性
d) 修改json中的屬性
e) 判斷json中是否有屬性
f) json中日期格式的處理
使用JSON.toJSONStringWithDateFormat,該方法可以使用設置的日期格式對日期進行轉換
4.1 maven依賴
4.2 基礎轉換類
同上
4.3 bean轉換json
a)將類轉換成Json,obj是普通的對象,不是List,Map的對象
b) 將List,Map轉換成Json
4.4 json轉換bean
4.5 json轉換List,對於複雜類型的轉換會出現問題
4.6 json轉換Map
4.7 json對於日期的操作比較複雜,需要使用JsonConfig,比Gson和FastJson要麻煩多了
創建轉換的接口實現類,轉換成指定格式的日期
4.8 JsonObject 對於json的操作和處理
a) 從json串中獲取屬性
b) 除去json中的某個屬性
c) 向json中添加和修改屬性,有則修改,無則添加
d) 判斷json中是否有屬性
fastjson 和 jackson 在把對象序列化成json字符串的時候,是通過反射遍歷出該類中的所有getter方法;
Gson 是通過反射遍歷該類中的所有屬性。
所以, 在定義POJO中的布爾類型的變量時,不要使用isSuccess這種形式,而要直接使用success 。
以上為網上摘抄,以下為實際項目中使用結果。
實體類為 BaseVO.java :
用Gson 將該實體類轉成json時報以下異常:
原因是:子類和父類有相同的字段屬性;
解決方法:
(1)重命名重複字段。因為重複的字段在第三方包中,所以該方法在本例中不可行。
(2)將實體類中需要打印的字段加上註解 @Expose ,(本例將該類所有有get方法的屬性都加上了) :
新建gson:
excludeFieldsWithoutExposeAnnotation 排除掉沒有Expose註解的屬性。
或者在不需要解析的字段前面加上 transient :
用該方式,沒有報異常了,解析結果(加註解 @Expose 或加 transient )如下:
但從結果來看,那些直接調用第三方api獲取值的屬性沒有解析,因為第三方的類無法加上 @Expose註解 ,導致這些屬性為 null ,而 Gson默認的規則不會解析為 null 的屬性 ,比如:
(3)換解析方式:使用FastJson。
因為FastJson是通過getter方法獲取屬性,並把其值序列化成json字符串的,所以這裡,我們這個實體類中去掉不想被解析的屬性的get方法,變成如下:
fastJson、JackJson以及Gson序列化對象與get、set以及對象屬性之間的關係
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/248700.html