网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

  One of the best things in life is seeing a smile on a person's face and knowing that you put it there.

  生活中最美好的一件事情是,因为你,某个人脸上洋溢着微笑。

  每日掏心话

  最美的不是生如夏花,而是在时间的长河里,波澜不惊。

  来自:咔咔侃技术 | 责编:乐乐

  链接: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。

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

  PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

  

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

  

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐

费迪南德:范尼曾在训练中欺负C罗并伤到他跟腱,结果被我打了

直播吧
2021-03-03 21:49:02

盘点20位被曝吸毒明星的近况,看看他们过得怎样?

代军哥哥谈娱乐
2021-03-02 17:04:50

李嘉诚将巨额财产分给了“三个儿子”,“功臣”梁洛施却无福享受

娱乐团长
2021-03-03 23:42:24

福原爱否认婚内出轨,称日本型男是精神好友,酒店过夜是分房睡

娱乐E君
2021-03-03 17:54:19

“错换人生28年”案件大反转,看似无辜的家庭竟是全员恶人?

尧天磊娱乐大咖
2021-03-01 17:26:25

毛超峰新职务首次披露,此前任海南省委常委、副省长

政知新媒体
2021-03-03 17:30:09

解放军“一声令下”!蔡当局嗅到不寻常信号,台军慌乱中终于出手

华钺聚焦
2021-03-02 18:22:26

震撼一幕!50多国疯抢军购大单,中国武器一亮相,美国无话可说

诸葛小彻
2021-03-03 11:29:34

你根本不知道,渣男为了骗女生上钩,都会用什么套路

好奇博士
2021-03-03 10:42:52

个人所得税起征点提高至1万元 你的薪资水平达到个税起征点了吗?

新盟财经
2021-03-03 18:25:17

7大群体不得接种新冠疫苗!卫健委权威发布,几句关键提醒要牢记

沐沐沐子
2021-02-28 23:21:51

辽宁20分惨败广厦!全华班原形毕露,郭艾伦20分0助攻,杨鸣危险

百乐体育大咖
2021-03-03 21:58:16

新加坡至今未通过中国疫苗,真正原因竟是……

新加坡万事通
2021-03-01 16:14:31

和前妻离婚后,她经常以探望孩子为由,在我家留宿

我是木子李
2021-03-02 00:28:54

房产税没等来,“这个税”先来了,最高20%!“抛售潮”会来吗?

房产新谈
2021-03-04 05:00:02

CBA速递:辽篮近4战3败,广东宏远官方喜讯,巩晓彬迎强援回归

多特体育说
2021-03-03 22:28:11

欲强奸某女被发现后,推门要走时,被叫了回来,刑法上如何评价?

八圈传播者
2021-03-01 06:15:13

美国搅局南海形成常态;解放军送来疫苗,老杜马上积极表态

火星方阵
2021-03-01 20:05:29

强势反弹!外资爆买!一夜之间牛市就回来了?| 檀几条

叶檀财经
2021-03-03 20:11:53

黄干宗:被2名越南女兵劫走当“压寨丈夫”,在原始森林生活13年

温波年
2021-03-01 16:03:48
2021-03-04 05:45:06
程序员小乐
程序员小乐
有趣有内涵
2097文章数 7859关注度
往期回顾 全部

科技要闻

电动车热潮!就算老罗宣布造车,我都不奇怪

头条要闻

借纳瓦利内事件对俄实施制裁 美频频示强意欲何为?

头条要闻

借纳瓦利内事件对俄实施制裁 美频频示强意欲何为?

体育要闻

38岁198天!贾吉尔卡成英超史上被罚下的第二老的球员

娱乐要闻

美少女!杨超越梳麻花辫嘟嘴卖萌

财经要闻

汽车要闻

首款纯电动轿跑SUV 沃尔沃发布C40 Recharge

态度原创

艺术
手机
旅游
数码
时尚

艺术要闻

安藤忠雄水之教堂复现

手机要闻

从爆红到凉凉!“蚂蚁呀嘿”只用了7天

旅游要闻

再过10天,全国人民都会羡慕婺源了!

数码要闻

自己也能向体内植入NFC芯片:附带配件太强

出道4年2位顶流男友 这女人怎么那么厉害?