点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

转自:咔咔侃技术链接:https://www.toutiao.com/i6815906868183958027/

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。对于这个问题,你有什么见解,欢迎留言评论。

热门内容:
  • 强大:MyBatis 流式查询

  • 微服务架构中配置中心的选择

  • 看看人家那后端API接口写得,那叫一个优雅!

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

真能一快遮百丑?为什么要弃坑FastJson相关推荐

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

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

  2. 比真机还快的Android模拟器——Genymotion

    比真机还快的Android模拟器--Genymotion                                                     ----转载请注明出处:coder-p ...

  3. 考研数学真题虐你千百遍,学渣教你如何逆袭数学130+

    转载于 考研网 离考试只剩两个多月了,此时还有很多小伙伴对数学复习一筹莫展,如何在这不到三个月的时间里取得突破拿到高分?我们的考研数学复习逐渐过渡到强化冲刺阶段,这一时期是考研备考的转折期~ 现阶段的 ...

  4. 从技术角度分析“抢票软件的加速”,真有多快?

    大部分人在昨天前天已经回程了,今天是年后的第一个工作日,不知道大家什么状态.我有2个状态并存:1.快点上班.2.继续休息. 为什么会有这2种状态呢,还得从娃说起.昨天月嫂回家一天,我算是体验了一把半夜 ...

  5. 清华伯克利造出机械小强:承重200万倍踩不死,跑得和真蟑螂一样快

    郭一璞 安妮 发自 凹非寺  量子位 报道 | 公众号 QbitAI 打不死的小强,真的是太讨厌了! 既然打不死,那--干脆仿造一个出来,为我所用,岂不是爽歪歪? 还真有人仿造成功了,最新的一期Sci ...

  6. 计算机2级ps真题百度云,【百度盘】Adobe Photoshop 2020 释怀特别版 | 21.2.1.265 | 633MB...

    免责声明:本系列软件仅供个人测试使用,不保证软件稳定性,欢迎大家支持和使用正版. 软件修改概况(以下修改内容适用释怀的2018.2020版) -精简运行库及更新组件: -精简创意云Creative C ...

  7. fastjson 版本_以快标榜的fastjson,快没快多少,倒是漏洞一大堆

    fastjson 说起fastjson 大家一定fast 感觉很快就用完了, 但是带来的效益是什么呢? fastjson到了2020年了还在一直漏洞. 随便百度一搜全是漏洞. [安全通告]Fastjs ...

  8. 我把SpringBoot项目从18.18M瘦身到0.18M,部署起来真省事!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:yjgithub 原文:http://suo.im/5OOW ...

  9. Lambda表达式入门,看这篇就够了!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:海向 cnblogs.com/haixiang/p/1102 ...

最新文章

  1. NBT:扩增子测序革命—用16S及18S rRNA全长进行微生物多样性研究
  2. Technet:服务器虚拟化备份和灾难恢复
  3. 静态库和共享库之间的区别?
  4. spring的Autowired和@Resource的区别是什么
  5. Debian 8.2 64位 安装MongoDB
  6. XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager,
  7. 传输层协议TCP和UDP的区别
  8. 第八期:实操:两台路由器,如何分别通过WAN和LAN口连接?
  9. C++编程积累——C++实现十进制与十六进制之间的互相转换
  10. 太极图正确画法_认识道教太极图,了解正规画法
  11. 纯js分页代码(简洁实用)
  12. SQL:pgsql中查询一段时间内数据及相关时间操作
  13. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_6_练习_转换文件编码...
  14. 上古卷轴5python_python 基础(五)协程 —— 微线程 greenlet gevent
  15. Python数据的精度
  16. python删除数据框中的字符串列_如何根据条件删除pandas数据框中的列?
  17. c++ 工厂模式简介和应用场景
  18. 单元测试系列一-为什么要写单元测试,何时写,写多细
  19. Zynga任命Noel Watson为董事会成员
  20. 苹果2014WWDC亮点之个人浅见

热门文章

  1. python的TCP编程
  2. Eclipse:xml文件中添加.xsd约束文件
  3. 在.NET2.0中解析Json和Xml
  4. jackson 解析json问题
  5. iPhone App开发导航条(Navigation Bar)素材PSD下载
  6. Java之替换“\n”符号
  7. 15级团队学习成果汇报 -- 利用C#语言实现展览厅
  8. java+script+当前日期_如何在JavaScript中获取当前日期?
  9. 龙芯架构应用迁移技术分享——搜狗输入法应用迁移
  10. 快速上手微软 “群策 MARO” 平台,打造简易的共享单车场景