關於fastjson與jackson在反序列化bool型時的區別


背景

在測試中,兩個項目a,b的接口參數用到了Bool類型,當傳參"0",項目a通過了,項目b報錯了,排查了下,項目b的那個接口,在對傳參反序列化時就出現了問題,最后發現兩個項目使用的序列化框架有所差異

處理邏輯

Fastjson處理邏輯

基於Fastjson 1.2.28版本的源碼:

  1. Bool類型,正常賦值

  2. int類型,若為1,則為true,否則為false

  3. number類型,若強轉int為1,則為true,否則為false

  4. string類型,若為空串、"null"、"NULL"則為null;若為"true","1"則為true;若為"false","0"則為false

  5. 其它情況拋錯can not cast to boolean

Jackson處理邏輯

基於Jackson 2.9.8版本的源碼:

  1. Bool類型,正常賦值

  2. Null類型,則為null

  3. Array類型,報錯

    1. 可配置mapper.configure(ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true),則支持空數組為null

    2. 可配置mapper.configure(UNWRAP_SINGLE_VALUE_ARRAYS, true),則以數組的第一個元素判斷true還是false,例如true,若多個元素也報錯)

  1. number類型,0為false,其它為true

    1. 可配置mapper.configure(ALLOW_COERCION_OF_SCALARS, false),則不支持強轉,都報錯

  1. string類型,若為"true","True"則為true;若為"false","False"則為false,若為"null",""則為null,其它報錯

    1. 可配置mapper.configure(ALLOW_COERCION_OF_SCALARS, false),則不支持強轉,都報錯

總結

有以下幾點,我覺得我以后需要注意的

  1. 當使用不同序列化框架時,對於正常傳參,不同框架的結果是一樣的,但對於不正常傳參,比如想把"0"反序列化成False,每個框架實現有所不同,要注意兩個框架的實現,可以通過多測試來發現。

  2. 雖然總所周知,Fastjson處理速度優於Jackson,但是在Bool類型,Jackson支持更多可配置的反序列化方案


免責聲明!

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



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