關於為什麼代碼里不要用fastjson的信息

本文目錄一覽:

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-tw/n/248700.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:29
下一篇 2024-12-12 13:29

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在著手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • 怎麼寫不影響Python運行的長段代碼

    在Python編程的過程中,我們不可避免地需要編寫一些長段代碼,包括函數、類、複雜的控制語句等等。在編寫這些代碼時,我們需要考慮代碼可讀性、易用性以及對Python運行性能的影響。…

    編程 2025-04-29
  • 北化教務管理系統介紹及開發代碼示例

    本文將從多個方面對北化教務管理系統進行介紹及開發代碼示例,幫助開發者更好地理解和應用該系統。 一、項目介紹 北化教務管理系統是一款針對高校學生和教職工的綜合信息管理系統。系統實現的…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29

發表回復

登錄後才能評論