看图说话,FastJson 并没有那么流行!

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 看图说话,FastJson 并没有那么流行!

一、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

if (strVal.endsWith(".000000000")) {
    strVal = strVal.substring(0, strVal.length() - 10);
} else if (strVal.endsWith(".000000")) {
    strVal = strVal.substring(0, strVal.length() - 7);
}
if (strVal.length() == 29 && strVal.charAt(4) == '-' && strVal.charAt(7) == '-' && strVal.charAt(10) == ' ' && strVal.charAt(13) == ':' && strVal.charAt(16) == ':' && strVal.charAt(19) == '.') {
    int year = num(strVal.charAt(0), strVal.charAt(1), strVal.charAt(2), strVal.charAt(3));
    int month = num(strVal.charAt(5), strVal.charAt(6));
    int day = num(strVal.charAt(8), strVal.charAt(9));
    int hour = num(strVal.charAt(11), strVal.charAt(12));
    int minute = num(strVal.charAt(14), strVal.charAt(15));
    int second = num(strVal.charAt(17), strVal.charAt(18));
    int nanos = num(strVal.charAt(20), strVal.charAt(21), strVal.charAt(22), strVal.charAt(23), strVal.charAt(24), strVal.charAt(25), strVal.charAt(26), strVal.charAt(27), strVal.charAt(28));
  return new Timestamp(year - 1900, month - 1, day, hour, minute, second, nanos);
}

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


“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

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


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


推荐去我的博客阅读更多:


1.Java JVM、集合、多线程、新特性系列教程


2.Spring MVC、Spring Boot、Spring Cloud 系列教程


3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程


4.Java、后端、架构、阿里巴巴等大厂最新面试题


觉得不错,别忘了点赞+转发哦!


相关文章
|
Windows
游戏编程之十 图像引擎DirectXDraw
游戏编程之十 图像引擎DirectXDraw
73 0
|
2月前
|
人工智能 Serverless
西游再现!Flux 大模型一键生成写实西游人物
快来报名参加西游AI活动,使用函数计算一键部署 Flux 大模型,生成写实西游人物图像赢取精美小风扇!
257 8
|
3月前
|
人工智能 JSON 算法
不是吧?这么好用的开源标注工具,竟然还有人不知道…
LabelU是一款专为AI项目设计的强大多模态数据标注工具,支持图像、视频、音频等多样化数据类型。它提供灵活的标注工具与自定义配置选项,让用户根据需求定制高效标注流程。特色功能包括一键载入预标注结果以简化修正工作,以及支持JSON、COCO等多种格式的导出选项。LabelU既可本地部署确保数据安全,也提供在线版本方便快速上手。此外,OpenDataLab还开源了Label-LLM对话标注工具和MinerU文档处理工具,进一步丰富了数据准备的工作流。欢迎访问[LabelU](https://github.com/opendatalab/labelU)了解更多详情,并为这些优秀工具点赞支持!
106 0
不是吧?这么好用的开源标注工具,竟然还有人不知道…
|
5月前
|
Java 编译器 开发者
JAVA注解,让代码“开口说话”的魔法术!
【6月更文挑战第29天】Java注解,一种元数据机制,让代码“开口”传达意图。它们增强可读性,提供编译器与框架处理代码的额外信息。例如,@Description注解描述方法功能,@Autowired在Spring中自动装配Bean,自定义注解如@MyCustomAnnotation允许定义独特行为。注解提升开发效率,是理解与使用Java的关键。
38 2
|
5月前
|
机器学习/深度学习 编解码 计算机视觉
【深度学习】探秘PSD:合成到真实去雾框架的实例解析
【深度学习】探秘PSD:合成到真实去雾框架的实例解析
83 0
|
6月前
|
存储 移动开发 安全
【C/C++ 口语】C++ 编程常见接口发音一览(不断更新)
【C/C++ 口语】C++ 编程常见接口发音一览(不断更新)
66 0
|
机器学习/深度学习 达摩院 数据挖掘
ICASSP2023论文代码开源|TOLD能对混叠语音建模的说话人日志框架
ICASSP2023论文代码开源|TOLD能对混叠语音建模的说话人日志框架
271 1
|
传感器 存储 编解码
即时通讯音视频开发(二十):一文读懂视频的颜色模型转换和色域转换
本文将以通俗易懂的文字,引导你理解视频是如何从采集开始,历经各种步骤,最终通过颜色模型转换和不同的色域转换,让你看到赏心悦目的视频结果的。
79 0
|
SQL XML 自然语言处理
从零开始构建一个电影知识图谱,实现KBQA智能问答[上篇]:本体建模、RDF、D2RQ、SPARQL endpoint与两种交互方式详细教学
从零开始构建一个电影知识图谱,实现KBQA智能问答[上篇]:本体建模、RDF、D2RQ、SPARQL endpoint与两种交互方式详细教学
从零开始构建一个电影知识图谱,实现KBQA智能问答[上篇]:本体建模、RDF、D2RQ、SPARQL endpoint与两种交互方式详细教学
|
Java Maven Python
开源框架WebCollector抓取图片初试
开源框架WebCollector抓取图片初试