• json序列化框架处理isXxx属性时的注意事项


    json序列化框架处理isXxx属性时的注意事项

    一、使用json框架序列化bean时,如果存在boolean类型且属性名是isXxx的小驼峰形式的属性,而且使用快捷键或@Data生成getter(),部分json框架序列化这个属性时会有问题,比如:
    1、假设bean存在boolean类型的属性isSubOrg;
    2、使用快捷键或@Data()生成的getter()是isSubOrg();
    3、json框架序列化时根据bean的isSubOrg()方法,所以在生成json对象的key是subOrg,但是预期是生成isSubOrg;

    二、常见的json框架:
    fastjson、gson、jackson
    存在上面问题的框架:fastjson、jackson

    三、解决方法:
    方法1:bean的boolean属性设置时不要以is作为小驼峰;
    方法2:不要使用@Data生成getter(),应该使用快捷键生成,然后手动修改成getIsXxx()的形式;
    方法3:使用Gson序列化对象;
    方法4:bean的布尔类型属性设置为包装类型Boolean(不要使用boolean)。

    问题现象:

    @Data
    public class PersonPhotoDto {
    
        private String name;
        private boolean isSubOrg;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    //fastjson
    PersonPhotoDto bean = new PersonPhotoDto();
    bean.setName("李四");
    bean.setSubOrg(true);
    String fastJsonStr = JSON.toJSONString(bean);
    System.out.println("fastjson方式:" + fastJsonStr);//{"name":"李四","subOrg":true}
    
    //gson
    Gson gson = new Gson();
    String gsonJsonStr = gson.toJson(bean);
    System.out.println("gson方式:" + gsonJsonStr);//{"name":"李四","isSubOrg":true}
    
    //jackson
    ObjectMapper objectMapper = new ObjectMapper();
    String jacksonJsonStr = objectMapper.writeValueAsString(bean);
    System.out.println("jackson方式:" + jacksonJsonStr);//{"name":"李四","subOrg":true}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    执行结果:

    fastjson方式:{"name":"李四","subOrg":true}
    gson方式:{"name":"李四","isSubOrg":true}
    jackson方式:{"name":"李四","subOrg":true}
    
    • 1
    • 2
    • 3
  • 相关阅读:
    C++ -------- 智能指针
    第1章 现代通信网概述
    如何指定JVM target 为1.8
    JAVA初阶数据结构栈(工程文件后续会上传)(+专栏数据结构练习是完整版)
    BS-GX-018 基于SSM实现在校学生考试系统
    【头歌】——Ethernet包分析(计算机网络)
    大数据架构师——音乐数据中心平台离线数仓综合项目(四)
    Ubuntu上安装 Chrome 浏览器
    OpenGL 褐色
    增量备份的保留策略
  • 原文地址:https://blog.csdn.net/weixin_44954895/article/details/127810373