背景
在測試中,兩個項目a,b的接口參數用到了Bool類型,當傳參"0",項目a通過了,項目b報錯了,排查了下,項目b的那個接口,在對傳參反序列化時就出現了問題,最后發現兩個項目使用的序列化框架有所差異
處理邏輯
Fastjson處理邏輯
基於Fastjson 1.2.28版本的源碼:
-
Bool類型,正常賦值
-
int類型,若為1,則為true,否則為false
-
number類型,若強轉int為1,則為true,否則為false
-
string類型,若為空串、"null"、"NULL"則為null;若為"true","1"則為true;若為"false","0"則為false
-
其它情況拋錯can not cast to boolean
Jackson處理邏輯
基於Jackson 2.9.8版本的源碼:
-
Bool類型,正常賦值
-
Null類型,則為null
-
Array類型,報錯
-
可配置mapper.configure(ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true),則支持空數組為null
-
可配置mapper.configure(UNWRAP_SINGLE_VALUE_ARRAYS, true),則以數組的第一個元素判斷true還是false,例如true,若多個元素也報錯)
-
-
number類型,0為false,其它為true
-
可配置mapper.configure(ALLOW_COERCION_OF_SCALARS, false),則不支持強轉,都報錯
-
-
string類型,若為"true","True"則為true;若為"false","False"則為false,若為"null",""則為null,其它報錯
-
可配置mapper.configure(ALLOW_COERCION_OF_SCALARS, false),則不支持強轉,都報錯
-
總結
有以下幾點,我覺得我以后需要注意的
-
當使用不同序列化框架時,對於正常傳參,不同框架的結果是一樣的,但對於不正常傳參,比如想把"0"反序列化成False,每個框架實現有所不同,要注意兩個框架的實現,可以通過多測試來發現。
-