fastjson2使用Feature.WriteBooleanAsNumber踩坑

Fastjson2作为Fastjson的重大升级,旨在提供更高性能和安全性的JSON处理。它移除了autoType白名单以增强安全性。然而,在使用中发现Feature.WriteBooleanAsNumber功能无法按预期将boolean值序列化为数字。经过尝试,无论是基本类型还是包装类,直接设置注解或使用方法均未成功。向官方提交的bug很快得到了修复,现在可以正确序列化boolean值了。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fastjson2 是 FASTJSON 项目的重要升级,目标是为下一个十年提供一个高性能的JSON库, fastjson2 性能相比原先旧的 fastjson 有了很大提升,并且 fastjson2 更安全,完全删除autoType白名单,提升了安全性。
地址: https://github.com/alibaba/fastjson2
添加依赖:

dependencies {
    implementation 'com.alibaba.fastjson2:fastjson2:2.0.25'
}

以下是一组性能对比数据:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

      fastjson2 > fastjson1 > jackson > gson
jdk8  100%        76.07%      39.15%    33.18%
jdk11 100%        73.15%      39.20%    34.59%
jdk17 100%        91.18%      35.55%    33.98%
jdk18 100%        85.52%      36.21%    28.54%
jdk19 100%        86.91%      37.48%    29.09%

但在用的过程中还是遇到了一些坑,记录如下:
Feature.WriteBooleanAsNumber 通过字面意思为为true的序列化成1,为false的值序列化成0,
但 通过

JSON.toJSONString(message, Feature.WriteBooleanAsNumber);

或者通过如下方式

  @JSONField(serializeFeatures = Feature.WriteBooleanAsNumber)
    private boolean human;
    
    public boolean isHuman() {
        return human;
    }

    public void setHuman(boolean human) {
        this.human = human;
    }

都无效生成的结果还是true 或者false,

那么,是否是isHuman出了问题呢,于是把isHuman改成getHuman,

  @JSONField(serializeFeatures = Feature.WriteBooleanAsNumber)
    private boolean human;
    
    public boolean getHuman() {
        return human;
    }

    public void setHuman(boolean human) {
        this.human = human;
    }

发现结果还是不对.

会不会是包装类和基本类型的问题呢,于是改成如下:

    @JSONField(serializeFeatures = Feature.WriteBooleanAsNumber)
    private Boolean human;

    public Boolean getHuman() {
        return human;
    }

    public void setHuman(Boolean human) {
        this.human = human;
    }

再次通过JSON.toJSONString(message); 发现还是无效,于是改成

    private Boolean human;

    public Boolean getHuman() {
        return human;
    }

    public void setHuman(Boolean human) {
        this.human = human;
    }

JSON.toJSONString(message, Feature.WriteBooleanAsNumber); 结果符合预期:{“human”:1}

这里有两个问题:
1:为什么基本类型不给支持?
2:为什么通过@JSONField(serializeFeatures = Feature.WriteBooleanAsNumber) 这种方式就不行?

顺手提了个issue给官方:
https://github.com/alibaba/fastjson2/issues/1241

发现官方速度好快,几个小时就已经有反馈,并且把这两个BUG给修复了,点个赞!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值