关于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类型,正常赋值fastjson字符串转数组
2. Null类型,则为null
3. Array类型,报错
1. 可配置figure(ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true),则⽀持空数组为null
2. 可配置figure(UNWRAP_SINGLE_VALUE_ARRAYS, true),则以数组的第⼀个元素判断true还是false,例如,若多
个元素也报错)
4. number类型,0为false,其它为true
1. 可配置figure(ALLOW_COERCION_OF_SCALARS, false),则不⽀持强转,都报错
5. string类型,若为"true","True"则为true;若为"false","False"则为false,若为"null",""则为null,其它报错
1. 可配置figure(ALLOW_COERCION_OF_SCALARS, false),则不⽀持强转,都报错
总结
有以下⼏点,我觉得我以后需要注意的
1. 当使⽤不同序列化框架时,对于正常传参,不同框架的结果是⼀样的,但对于不正常传参,⽐如想把"0"反序列化成False,每个框架
实现有所不同,要注意两个框架的实现,可以通过多测试来发现。
2. 虽然总所周知,Fastjson处理速度优于Jackson,但是在Bool类型,Jackson⽀持更多可配置的反序列化⽅案
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论