zoukankan      html  css  js  c++  java
  • 关于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支持更多可配置的反序列化方案

  • 相关阅读:
    thinkPHP框架学习笔记
    ajax的项目实操(只用于记录部分文件未引入)
    js中两个感叹号的原理与用法分析(转载记录没找到原帖)
    html5+css3学习笔记-prefixfree前缀补全插件
    背景图动起来就这么简单!
    flash设计师罢工,小前端顶上
    onbeforeunload与a标签在IE中的冲突bug(转载)
    js自定义的简易滚动条
    2020牛客国庆集训派对day2
    马拉车算法 Manacher
  • 原文地址:https://www.cnblogs.com/dj3839/p/11325603.html
Copyright © 2011-2022 走看看