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给修复了,点个赞!