最近在知乎上看到很多吐槽 FastJSON 安全性的文章。想了想之后,决定看一下 FastJSON 到底有多快。
FastJSON
阿里巴巴出的一个开源 JSON 库。这个库有几个特点:
- 快(跑分高)
- API 好用,开箱即用。举两个例子
JSON类下的几个静态方法就直接覆盖了常见使用场景JSONObject本身就是个Map
- 安全漏洞多(每隔一段时间就会爆出安全漏洞,可以去知乎上搜搜,一大堆)
- Made in CHINA!
基于以上原因:
- 如果你不想每隔一段时就升级 FastJSON 库以堵住已知安全漏洞,要么就忽略漏洞,要么就不要使用这个库
- 如果要求更快的 JSON 处理速度,请先想想这到底是不是性能瓶颈
- 如果只是为了使用更好用的 API,建议先学学市面上的其他 JSON 库,其他库是否真的很难用
- 如果你就是想支持国产,那自然就不用多说了,用就完了
Jackson
Spring Boot 默认使用 Jackson 作为默认的 JSON 处理工具。Jackson 有几个特点:
- 快(虽然比 FastJSON 慢一点,但真的是只慢一点)
- API 稍复杂(我就想把 JSON 字符串转成对象,或者把对象转成 JSON 字符串,结果要搞一堆啰嗦的东西,这是 Java 库的通病?)
- 代码质量较高
- 安全稳定(虽然也有安全问题,但肯定没 FastJSON 那么频繁)
- 配置灵活(换句话说就是配置成本高)
其他常见 JSON 库
- Apache Johnzon:Apache 顶级项目。它是 JSON-P 1.1 规范 (JSR-353) 和 JSON-B 1.0 规范 (JSR-367) 的一个完整实现。戳这里去官网页面 。官网给的用法示例,和 JSON-B API 差别还是比较大的。
- Eclipse Yasson:Eclipse 出品。它是 JSON-B (JSR-367) 的官方实现。
- Google Gson:谷歌出品
- Genson:用于 Java 和 Scala 的、强大易用的 JSON 库
还有一些比较冷门的 JSON 库,可以在 https://www.json.org/json-zh.html 看到。
跑分
我装模作样地搞了一下这几个库的跑分(戳这里看代码)。下面是其中一次的跑分结果:
╭──────────┬─────────┬───────────╮│ lib │ parse │ stringify │├──────────┼─────────┼───────────┤│ gson │ 750ms │ 663ms │├──────────┼─────────┼───────────┤│ fastJson │ 537ms │ 283ms │├──────────┼─────────┼───────────┤│ jackson │ 695ms │ 435ms │├──────────┼─────────┼───────────┤│ johnzon │ 1377ms │ 666ms │├──────────┼─────────┼───────────┤│ yasson │ 17669ms │ 1066ms │╰──────────┴─────────┴───────────╯
可以看到,FastJSON 真的很快,但 Jackson 也不差。结合 FastJSON 经常暴露安全漏洞这个情况,Spring 选择 Jackson 作为默认 JSON 库还是很有道理的。
