真能一快遮"百丑"?为什么要弃坑 FastJson

简介: 首先抄录一段来自官网的介绍:FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

最近艿艿和朋友们正在肝一个单体的开源项目:https://github.com/YunaiV/ruoyi-vue-pro

上周末把项目中使用到 FastJSON 的地方,全部替换成 Jackson,涉及到的点有:

  1. 使用 JSON 的地方,使用封装的 JsonUtil 替换
  2. SpringMVC 的消息转换器,替换成 Jackson 实现的
  3. Spring Data Redis 的对象转换器,替换成 Jackson 实现的
  4. MyBatis 使用到 JSON TypeHandler 的地方,替换成 Jackson 实现的
  5. 和时间序列化相关的,需要稍微注意下,具体可以看看 spring.jackson 配置项

因为 FastJSON 存在一些非标的行为,所以替换之后,还是要回归下~

另外,没有考虑使用 GSON 的原因,一方面它最后维护时间是 2019 年,一方面一些开源库内嵌使用了 Jackson 的特性

记得 Star 关注下噢,胖友们的支持,真的很重要!

一、FastJson为何

首先抄录一段来自官网的介绍:FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

FastJson是Java程序员常用到的类库之一,相信点开这个页面的你,也肯定是程序员朋友。正如其名,“快”是其主要卖点。


image.png

二、真的很快吗?

没有调研就没有发言权,本着“追求真理”的初心,来一轮简单的测试。对比对象选择应用最广泛的Jackson和Google出品的Gson。测试环境选择JDK 8,AMD 3700X,3200MHZ内存。简化实验,只测试简单对象和复杂对象的String转对象、对象转String,调用1千万次的对比结果如下(时间单位是毫秒):


image.png

从测试结果看,FastJson确实是最快的,但仅比Jackson快20%左右,Google的Gson是最慢的,差距较大。读到这里,是不是觉得选择FastJson肯定没错啊!如果面试官问为什么选择FastJson?因为快!这一个理由就可以把他顶回去了。

这里的调查研究并不是很充分,没有对内存占用、大文档的测试。

在现代应用程序中,即使最慢的Gson,也是满足需求的;解析文档速度的快慢,并不能作为选型的唯一标准,可能连主要标准都算不上。对IO优化,并行处理等优化措施,比选用一个更快的库更有效。

三、FastJson并没有那么流行

然而,FastJson并没有那么流行,有一个最直观的数据,那就是在Maven的中的引用量,和Jackson和Gson不在一个数量级,和Jackson强大的家族更没法比。


image.png

难道我用了一个假的流行的国产类库?在知乎看到了一篇帖子,讨论为什么外国友人不喜欢FastJson。结论就是FastJson是个代码质量不高的国产类库。完全颠覆了我的认知,因为在我的项目中,是经常使用FastJson的,并没有出现什么Bug,而且这段评论是在2016年写的。


image.png

抱着怀疑的态度,打开FastJson的地址,看到大家提的Issues。竟然有1283个未解决的Issues。红框标识出来的,我自己拿去研究下,因为我看到下面还有人提了一样的问题。

image.png

测试代码如下:

image.png

果然,在采用了最新版本的类库后,如问题描述的,还是有异常。于是就看到了如下的源代码:

image.png

这段代码有严重的逻辑错误,这样错误的格式,例如:

“1970-01-01 00:00:00.000000000.000000000”

或者

“1970-01-01 00:00:00.000000000.000000”

也能转换成功,而一些正确的格式,例如:

““1970-01-01 00:00:00”,““1970-01-01 00:00:00.000”

却转换失败。

结合知乎上网友的点评,我本人也觉得FastJson并没有那么优秀,另一些深入的点评,例如ASM,我的理解并不深,就不做测试了。

四、弃坑fastjson

在我负责的项目中,因为SpringBoot相关的框架中,应用了Jackson,本着“最少依赖”的原则,json解析应用了Jackson。但是很多同事的代码中,也用了Gson和Fastjson,当然,是没有严格规范要求的结果。

通过今天的一个小小研究,Jackson的流行,是有着内在的原因的。在我们以后的项目中,主推Jackson,逐渐的淘汰Fastjson。

相关文章
|
Java 数据库连接 Go
如何在Spring Boot应用中使用Nacos实现动态更新数据源
如何在Spring Boot应用中使用Nacos实现动态更新数据源
1393 0
|
SQL 存储 人工智能
ISO 专家解读 | 什么是 GQL 国际标准图查询语言
4 月 12 日,图查询标准语言 GQL(Graph Query Language)正式发布。与此同时,悦数图数据库 v5.0 宣布原生支持 GQL。GQL 一经问世,便在图行业内外引起广泛关注, ISO 数据库语言项目召集人 Keith W. Hare 发布了一篇对 GQL 的解读文章。让我们跟随专家的视角,来了解一下什么是 GQL,以及 GQL 数据库语言的功能。
|
Java iOS开发 MacOS
学妹:你的 IDEA 主题怎么这么好看?
哈喽,小伙伴们好呀。我是狗哥,今天不聊技术,聊聊我们的吃饭工具。经常有小伙伴问我:“你的 IDEA 主题怎么这么好看,能推荐一下不?”。问的人太多了,才索性写了这篇文章。 在这篇文章中,我精选了几个比较适合 Java 编码的 IDEA 主题供小伙伴们选择。另外,我自己用的是 One Dark theme 这款。
学妹:你的 IDEA 主题怎么这么好看?
|
存储 JSON 数据库
vue3中实现文件上传---通过element-plus的upload组件
vue3中实现文件上传---通过element-plus的upload组件
|
5月前
|
人工智能 自然语言处理 安全
2026年部署OpenClaw Skills实战记录:零基础用户从零打造远程服务器巡检技能
在AIOps领域飞速发展的今天,Agent Skills凭借轻量化、高定制性的优势,逐渐替代传统MCP方案,成为智能运维的核心工具。而OpenClaw作为开源AI助手的佼佼者,不仅支持多平台对接与本地部署,更提供了极简的Skills定制能力——无需复杂编码,通过自然语言交互即可生成专属功能模块。本文以企业高频需求的“远程Linux服务器巡检”为例,详细拆解OpenClaw Skills的开发全流程,涵盖需求定义、交互配置、文件解析、测试优化等核心环节,搭配可直接复用的代码模板与阿里云快速部署方案,确保零基础用户也能快速上手,全程不改变原意,不含无关平台信息。
1723 1
|
安全 Linux 编译器
BigCloud Enterprise Linux 8和Rocky Linux 8升级OpenSSH步骤
本文介绍了在BigCloud Enterprise Linux 8.2/8.6和Rocky Linux 8.10上升级OpenSSH的详细步骤。首先配置Telnet服务和GCC编译器以确保远程登录安全,接着备份旧版OpenSSH并下载、编译、安装最新版本(如9.9p1)。然后创建新的sshd系统服务配置文件,调整配置并启动服务。最后验证升级效果,关闭不必要的Telnet服务,并处理可能的防火墙和SELinux问题。通过这些步骤可有效修复低版本OpenSSH带来的高危漏洞。
1030 13
|
计算机视觉
pyt魔搭训练常用代码
本文分享了在魔搭社区进行目标检测训练的经验与代码,涵盖数据解压、配置文件设置、模型训练及格式转换等关键步骤,助力快速上手YOLO模型训练。
|
虚拟化 Windows
M1/M2 Pro VMware Fusion虚拟机安装Win11教程(超详细) 3
M1/M2 Pro VMware Fusion虚拟机安装Win11教程(超详细)
4374 1
|
机器学习/深度学习 运维 TensorFlow
使用Python实现深度学习模型:智能交通管控与智慧城市
【7月更文挑战第27天】 使用Python实现深度学习模型:智能交通管控与智慧城市
559 4
使用Python实现深度学习模型:智能交通管控与智慧城市
|
存储 算法 Java
JVM垃圾收集-ZGC的染色指针
垃圾收集是回收以前分配的内存的机制, 以便将来的内存分配可以重用它。
1513 0
JVM垃圾收集-ZGC的染色指针