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

目录
相关文章
|
5月前
|
人工智能 Java 程序员
搭建AI智能体的Java神器:Google ADK深度解析
想用Java构建复杂的AI智能体?Google开源的ADK工具包来了!代码优先、模块化设计,让你像搭积木一样轻松组合智能体。从单体到多智能体系统,从简单工具到复杂编排,这篇文章带你玩转Java AI开发的全新境界。
|
关系型数据库 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数据库表报错
1335 0
|
应用服务中间件 nginx Docker
Docker Swarm、Docker Stack和Portainer的使用
Docker Swarm、Docker Stack 和 Portainer 各有其独特的功能和优势。Docker Swarm 适用于分布式服务的管理和编排,Docker Stack 便于多容器应用的定义和部署,而 Portainer 提供了直观的 UI,简化了 Docker 环境的管理。结合使用这些工具,可以大大提高容器化应用的部署和管理效率。希望本文对您理解和应用这些工具有所帮助。
677 5
|
存储 Linux 虚拟化
用户空间 I/O HOWTO【ChatGPT】
用户空间 I/O HOWTO【ChatGPT】
|
消息中间件 存储 SQL
ClickHouse实时数据处理实战:构建流式分析应用
【10月更文挑战第27天】在数字化转型的大潮中,企业对数据的实时处理需求日益增长。作为一款高性能的列式数据库系统,ClickHouse 在处理大规模数据集方面表现出色,尤其擅长于实时分析。本文将从我个人的角度出发,分享如何利用 ClickHouse 结合 Kafka 消息队列技术,构建一个高效的实时数据处理和分析应用,涵盖数据摄入、实时查询以及告警触发等多个功能点。
696 0
|
JSON 前端开发 Java
(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面
(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面
1559 0
|
数据库 索引
DROP INDEX 语句
【7月更文挑战第20天】DROP INDEX 语句。
461 2
|
Java Spring
SpringBoot - @Async异步任务与线程池
SpringBoot - @Async异步任务与线程池
907 1
|
Java 关系型数据库 数据库
关于SQLRecoverableException问题的排查和分析
上周在升级的时候,客户反馈某个job报了下面的错误,想让我们查看一下是不是数据库这边有什么问题。 报错的内容如下。Caused by: java.sql.SQLRecoverableException: No more data to read from socket         at oracle.
3468 0
|
存储 机器学习/深度学习 监控
生产中的大语言模型(MEAP)(一)(5)
生产中的大语言模型(MEAP)(一)
256 0