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支持更多可配置的反序列化方案

  • 相关阅读:
    HDU 1102 Constructing Roads
    HDU 1285 确定比赛名次。
    最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
    HDU Jungle Roads 1301 最小生成树、
    并查集小结(转)
    HDU hdu 2094 产生冠军 拓扑排序 判定环
    模运算(转)
    拓扑排序(主要是确定环和加法) HDU 2647 Reward
    HDU 1372 Knight Moves 简单BFS
    用计算机模型浅析人与人之间沟通方式 (一)如何谈话
  • 原文地址:https://www.cnblogs.com/dj3839/p/11325603.html
Copyright © 2011-2022 走看看