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

回复”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 中的trim标签,好用!
求求你们了,别再写满屏的 try catch 了!!“干掉” Date,Java8 LocalDate 真香!
浅析 VO、DTO、DO、PO 的概念、区别和用处!学会 IDEA REST Client后,postman就可以丢掉了...
Java 处理 Exception 的 9 个最佳实践!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。明天见(。・ω・。)ノ♡

再见,FastJson...相关推荐

  1. 深度对比Jackson和Fastjson,最终我还是选择了...

    点击关注公众号,Java干货及时送达 来源:cnblogs.com/larva-zhh/p/11544317.html 为什么要替换fastjson 框架选型 替换fastjson Deseriali ...

  2. Jackson、FastJson快速入门(整合SpringMVC)

    目录 1. 什么是 JSON 2. JSON 语法规则 3. JSON 与 JS 对象的关系 4. JSON 和 JS 对象互转 5. Jackson-数据格式转换 1. 环境搭建 2. 对象转jso ...

  3. 荣耀30pro系统_荣耀30 pro:正式再见!

    但随着市场竞争加剧,最近荣耀在价格上再次妥协,也是为了给新机开始让步,马上就是荣耀V40系列的发布会了,迭代荣耀30 pro+也不再坚挺,笔者从第三方平台上看到数据,荣耀30pro+这款手机大降520 ...

  4. FastJson 简单使用

    对象.List转Json User user = new User(); /*JSON 序列化,默认序列化出的JSON字符串中键值对是使用双引号,如果需要单引号的JSON字符串, [eg:String ...

  5. 42. fastjson处理下划线和驼峰问题的方法和源码分析

    一. 前言 在开发过程中经常遇到json解析和生成的问题,所以用自己也一直用fastjson来实现这个功能. 但是,最近遇到一个问题: json字符串里面的数据很多都是"_"下划线 ...

  6. fastJson结合Nutz.Mapl的进阶应用

    为什么80%的码农都做不了架构师?>>>    今天要做一堆数据的序列化, 反序列化, 序列化没问题, 反序列化却遇到了点小意外, 这一堆数据不是一个类!!!!!!当然可以通过类内部 ...

  7. 再见了,Python!!

    结合我最近这些年的 Python 学习.开发经验,发现近90%的程序员在学 Python 时都会遇到下面这3个问题: 1.想学Python,但不知从何学起,应用方向太多了也不知道该选择什么方向... ...

  8. 再见,Python!

    结合我最近这些年的 Python 学习.开发经验,发现近90%的程序员在学 Python 时都会遇到下面这3个问题: 1.想学Python,但不知从何学起,应用方向太多了也不知道该选择什么方向... ...

  9. 再见 Python,Hello Julia!

    作者 | Rhea Moutafis 译者 | 苏本如,责编 | 夕颜 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 随着Python的停滞不前,一个新的热门竞争对 ...

最新文章

  1. 用数据品鉴咖啡,407杯咖啡数据教你如何区分咖啡等级和风味
  2. PHP solr服务器搭建,搜索方案 solr+php如何安装配置?
  3. golang 字符串 去除最后一个字符
  4. java怎么删除List中的指定元素
  5. Java集合中的排序API分析
  6. SQL Server 索引结构及其使用(一)[转]
  7. 国产CPU群雄逐鹿谁主沉浮
  8. NOIP2001题目汇总
  9. git remote: User permission denied
  10. 137页Python学习笔记,全面总结看这一篇就够了
  11. Android 虚拟Camera实现方案
  12. 负反馈放大电路实验报告
  13. 第十周项目2——二叉树的便利的递归算法
  14. Kotlin协程createCoroutine和startCoroutine原理
  15. 推荐免费下载430套大型企业管理源码 下载地址:http://www.hur.cn/tg/linkin.asp?linkid=205389 下载地址:[URL=http://www.hur.cn/t
  16. STM32【H7】理论——综述、HAL库简述
  17. Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization
  18. Android malware样本SLocker Mobile Ransomware
  19. mathtype在word出现宏被禁止的错误 终于解决
  20. 18c和12客户端 oracle,客户端连接 12、18c 报ORA-28040和ORA-01017 的解决方法

热门文章

  1. js 验证数据类型的4中方法
  2. 程序员的自我救赎---13.1:职场招聘与面试心得
  3. 步步为营-44-窗体之间传值--观察者模式
  4. 查询数据库所有表、字段、触发器等
  5. Microsoft .NET Framework 4.6.1
  6. 摄像机的几个重要的技术指标
  7. 刻意练习:LeetCode实战 -- Task19. 相同的树
  8. Matlab与线性代数 -- 均匀分布的随机矩阵
  9. 压力测试 闪存_产品评测 | HPE Nimble AF全闪存系列,诠释真正的高端存储
  10. 两个使用 Pandas 读取异常数据结构 Excel 的方法,拿走不谢!