• 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
  • 相关阅读:
    【NestJS系列】核心概念:Providers提供者
    C++11继承构造函数在类中的使用
    SP11 FCTRL - Factorial
    SQL:sql连接那些事儿
    dart 学习 之 字符串插值,空变量 null,避空运算符,条件属性访问,集合字面量,箭头语法
    Java日期类汇总
    游戏客户端--个人学习路线总结、指北
    云计算-Linux-小综合实验答案
    项目管理【引论二】项目管理的逻辑
    VS+CUDA环境配置
  • 原文地址:https://blog.csdn.net/weixin_44954895/article/details/127810373