fastjson2使用Feature.WriteBooleanAsNumber踩坑

简介: fastjson2使用Feature.WriteBooleanAsNumber踩坑

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

目录
相关文章
|
缓存 IDE 安全
基准测试神器JMH —— 详解36个官方例子
基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。而JMH是一个用来构建,运行,分析Java或其他运行在JVM之上的语言的 纳秒/微秒/毫秒/宏观 级别基准测试的工具。
1486 1
基准测试神器JMH —— 详解36个官方例子
|
6天前
|
JSON fastjson Java
fastjson是什么东西,怎么用?
fastjson是什么东西,怎么用?
|
6天前
|
存储 Java 关系型数据库
Spring Batch学习记录及示例项目代码
Spring Batch学习记录及示例项目代码
|
9月前
|
人工智能 Java
SpringBoot实战(一):使用Lombok简化你的代码
SpringBoot实战(一):使用Lombok简化你的代码
小白救星-SpringBoot最简教程04: lombok技术
当一个类的字段特别多时,整个文件看起来将非常不简洁。所幸IDEA提供了一款lombok插件,可以在代码阶段,通过添加注解的形式,省去手写getter, setter的麻烦。
|
Java fastjson 数据库连接
实战,读懂maven <scope>
实战,读懂maven <scope>
|
IDE Java Maven
代码神器——Lombok
代码神器——Lombok
145 0
代码神器——Lombok
|
监控 NoSQL Redis
聊一聊redisson及优雅实现【2022最新最新版本】
【2022-11-9最新版本3.17.7】相信看了这个标题的同学,对这个问题以已经非常不陌生了,信手拈来redisson的几大特性:重入、阻塞、续约,今天讲以大白话源码理解方式来讲解
553 0
|
Java 容器 Spring
Springboot Condition 实用讲解,只看一遍包学会
Springboot Condition 实用讲解,只看一遍包学会
207 0
Springboot Condition 实用讲解,只看一遍包学会