往期热门文章:

1,《往期精选优秀博文都在这里了!》

2、呕心沥血总结的14张思维导图,教你构建 Python核心知识体系(附高清下载)

3、一份来自亚马逊技术专家的Google面试指南,GitHub收获9.8万星,已翻译成中文

4、支付宝系统架构(内部架构图)

5、牛逼!IDEA 2020 要本土化,真的是全中文了!中国开发者话语权越来越大了

作者:咔咔侃技术

toutiao.com/i6815906869198979587

FastJson为何物

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

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

真的很快吗?

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

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

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

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

FastJson并没有那么流行

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

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

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

测试代码如下:

try {String time = "1970-01-01 00:00:00";com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();jsonObject.put("time", time);Timestamp timestamp = jsonObject.getTimestamp("time");System.out.println("time:" + timestamp);} catch (Exception e) {e.printStackTrace();}

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

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

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

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

对于这个问题,你有什么见解,欢迎留言评论。

另:公众号后台回复【2T】有惊喜礼包!

推荐阅读 ↓↓↓

1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

2.如何才能成为优秀的架构师?

3.从零开始搭建创业公司后台技术栈

4.“37岁,985毕业,年薪50万,被裁掉只用了10分钟”

5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6.副业&接私活必备的 10 个开源项目!

7.你知道哪10大算法统治着全球吗?

8.15张图看懂瞎忙和高效的区别!

为什么我们公司强制弃坑Fastjson了?主推...相关推荐

  1. 为什么要强制弃坑Fastjson而主推Jackson?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:toutiao.com/i681590686818 ...

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

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:咔咔侃技术链接:https://www.toutia ...

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

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:咔咔侃技术 toutiao.com/i68159068681 ...

  4. BM弃坑EOS:江山易改,本性难移

    (图片来源于网络) 10号,BM宣布辞去EOS的CTO(首席技术官)职务.EOS应声下跌.其实都不用应声下跌,从比特币开启这一波小牛行情以来,EOS就没涨过.EOS持币者相互开玩笑说,EOS横盘水平堪 ...

  5. devc++64位不兼容_DNF玩家遭强制脱坑,只因64位更新后无法上游戏,如何解决?...

    DNF就在8月20更新了64位的客户端,对于此次从32位客户端升级至64位客户端,其实策划早在一个月之前就对玩家告知了,得知了更新之后会减少卡顿,掉线,C++报错的现象,玩家也是非常期待64位客户端的 ...

  6. freenas安装使用和弃坑

    简介 最近入手了一个nas,对于nas系统选择的方面,开始我是使用u-nas,但是这个系统web界面不是特别好,在安装软件方面bug很多,给人的感觉就是不是特别稳定,对于黑群晖我也是拒绝的,所以考虑再 ...

  7. 浮点高精求和(洛谷P2393题题解,弃坑Java拥抱C++)

    题目要求 P2393题目链接 分析 这题实则是变态的大浮点加法,众所周知的是浮点不精确,按照IEEE754来. 原先使用Java写的,但下面分析一下为什么不能用Java写. 这代码本来是这么写的: i ...

  8. 有趣的html代码_千万别惹程序员,否则会在代码注释里,告诉这家公司有多坑...

    Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,都放在了文章结尾,欢迎前来领取! 每个程序员敲代码都 ...

  9. PAT/PTA甲级2020春季题目【满分】弃坑贴

    开局上张图: 更一下题目通过率,有点吃惊... PAT甲级考纲:(官网目前已经删除了,以前是有的,见下文) 先说一下今天考试的整体情况: 因为这是第一次线上考试,导致很多地方包括很多同学的网络,设备等 ...

  10. jzy3D安装到弃坑

    jzy3D从入门到弃坑 安装 http://www.jzy3d.org/ 官网 选择DL 选择0.9版使用,而不要使用其他版本 具体原因 高版本不稳定 高版本例子收费 下面实例代码 Easy to u ...

最新文章

  1. Handler消息处理机制
  2. 白话Elasticsearch31-深入聚合数据分析之bucket与metric
  3. Boost:宏BOOST_TEST_EQ的测试
  4. python_day6 shutil模块
  5. quill一些插件的配置 注意事项
  6. html缓慢下拉,html - 列表下拉导航-适用于除野生动物园之外的所有浏览器。 间隔开并缓慢 - 堆栈内存溢出...
  7. android arm 寄存器,ARM汇编
  8. [Node.js] mySQL数据库 -- NPM包
  9. Java 枚举(enum)
  10. Ruby module里的self
  11. JPG/PNG转SVG矢量格式
  12. 怎样将英文html文件转换成中文,如何在html文件中修改文本中的英文文字为中文?源代码识别不了...
  13. 2×3卡方检验prism_何时应该使用非参数检验?
  14. 一场分销裂变活动,不止是发发朋友圈这么简单
  15. 动态页面抓取超级指南_减少页面重量的完整指南
  16. 裸金属服务器性能描述,裸金属服务器性能描述
  17. BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp
  18. 韩国商业网站界面设计分析------推荐2005-5-24 出处:vipcn.com
  19. Windows10 任务栏网络图标消失不见的解决办法
  20. Duplicate named routes definition:

热门文章

  1. CentOS 7 最小化安装后的注意事项(一)
  2. 让你口水不停的最新台湾美食推荐
  3. python greenlet背景介绍与实现机制
  4. 存储基础知识(八):备份技术(上)
  5. 459B Pashmak and Flowers
  6. HDU 1754 I Hate It 基础线段树
  7. Mac 屏幕可不可以用酒精清洁?正确清洁 Mac 的方法
  8. iOS开发之NSData和NSString相互转换
  9. 010 Editor for Mac(十六进制编辑器)v12.0
  10. 如何设置Mac允许远程电脑SSH登录?