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

目录
相关文章
|
JSON 算法 fastjson
com.alibaba.fastjson转换JSONObject数据后顺序与原JSON字符串顺序不一致原因分析
Json字符串转JSONObject对象保证属性及其内部JSONObject有序(本身顺序而非需要指定排序)
4254 1
|
11月前
|
人工智能 安全 Java
掌握 Spring 中的 WebClient
本文介绍了 Spring Boot 开发中 WebClient 的使用场景及优势。WebClient 是非阻塞响应式 Web 客户端,适合高并发、流式数据处理和微服务通信。它支持事件驱动架构、大文件传输、超时重试机制,并可与 OAuth2 集成实现安全通信。相比 RestTemplate,WebClient 提供更高效的资源利用和灵活的并发处理能力,适用于现代响应式应用开发。文中通过代码示例详细对比了两者的区别,展示了 WebClient 在异步编程中的强大功能。
1356 0
|
NoSQL MongoDB 数据库
MongoDB备份与恢复总结
MongoDB备份与恢复总结
1242 0
|
10月前
|
人工智能 Java 程序员
搭建AI智能体的Java神器:Google ADK深度解析
想用Java构建复杂的AI智能体?Google开源的ADK工具包来了!代码优先、模块化设计,让你像搭积木一样轻松组合智能体。从单体到多智能体系统,从简单工具到复杂编排,这篇文章带你玩转Java AI开发的全新境界。
1319 1
|
存储 Linux 虚拟化
用户空间 I/O HOWTO【ChatGPT】
用户空间 I/O HOWTO【ChatGPT】
|
Java 关系型数据库 数据库
关于SQLRecoverableException问题的排查和分析
上周在升级的时候,客户反馈某个job报了下面的错误,想让我们查看一下是不是数据库这边有什么问题。 报错的内容如下。Caused by: java.sql.SQLRecoverableException: No more data to read from socket         at oracle.
3553 0
|
Java Spring
SpringBoot - @Async异步任务与线程池
SpringBoot - @Async异步任务与线程池
1338 1
|
Java API 存储
java中Map遍历详解
java中Map遍历详解
|
关系型数据库 MySQL 数据库
Specified key was too long; max key length is 767 bytes导入mysql数据库表报错
Specified key was too long; max key length is 767 bytes导入mysql数据库表报错
1558 0
|
存储 机器学习/深度学习 监控
生产中的大语言模型(MEAP)(一)(5)
生产中的大语言模型(MEAP)(一)
369 0