最近在知乎上看到很多吐槽 FastJSON 安全性的文章。想了想之后,决定看一下 FastJSON 到底有多快。

FastJSON

阿里巴巴出的一个开源 JSON 库。这个库有几个特点:

  1. 快(跑分高)
  2. API 好用,开箱即用。举两个例子
    1. JSON 类下的几个静态方法就直接覆盖了常见使用场景
    2. JSONObject 本身就是个 Map
  3. 安全漏洞多(每隔一段时间就会爆出安全漏洞,可以去知乎上搜搜,一大堆)
  4. Made in CHINA!

基于以上原因:

  1. 如果你不想每隔一段时就升级 FastJSON 库以堵住已知安全漏洞,要么就忽略漏洞,要么就不要使用这个库
  2. 如果要求更快的 JSON 处理速度,请先想想这到底是不是性能瓶颈
  3. 如果只是为了使用更好用的 API,建议先学学市面上的其他 JSON 库,其他库是否真的很难用
  4. 如果你就是想支持国产,那自然就不用多说了,用就完了

Jackson

Spring Boot 默认使用 Jackson 作为默认的 JSON 处理工具。Jackson 有几个特点:

  1. 快(虽然比 FastJSON 慢一点,但真的是只慢一点)
  2. API 稍复杂(我就想把 JSON 字符串转成对象,或者把对象转成 JSON 字符串,结果要搞一堆啰嗦的东西,这是 Java 库的通病?)
  3. 代码质量较高
  4. 安全稳定(虽然也有安全问题,但肯定没 FastJSON 那么频繁)
  5. 配置灵活(换句话说就是配置成本高)

其他常见 JSON 库

  • Apache JohnzonApache 顶级项目。它是 JSON-P 1.1 规范 (JSR-353) 和 JSON-B 1.0 规范 (JSR-367) 的一个完整实现。戳这里去官网页面 。官网给的用法示例,和 JSON-B API 差别还是比较大的。
  • Eclipse YassonEclipse 出品。它是 JSON-B (JSR-367) 的官方实现。
  • Google Gson谷歌出品
  • Genson用于 Java 和 Scala 的、强大易用的 JSON 库

还有一些比较冷门的 JSON 库,可以在 https://www.json.org/json-zh.html 看到。

跑分

我装模作样地搞了一下这几个库的跑分(戳这里看代码)。下面是其中一次的跑分结果:

  1. ╭──────────┬─────────┬───────────╮
  2. lib parse stringify
  3. ├──────────┼─────────┼───────────┤
  4. gson 750ms 663ms
  5. ├──────────┼─────────┼───────────┤
  6. fastJson 537ms 283ms
  7. ├──────────┼─────────┼───────────┤
  8. jackson 695ms 435ms
  9. ├──────────┼─────────┼───────────┤
  10. johnzon 1377ms 666ms
  11. ├──────────┼─────────┼───────────┤
  12. yasson 17669ms 1066ms
  13. ╰──────────┴─────────┴───────────╯

可以看到,FastJSON 真的很快,但 Jackson 也不差。结合 FastJSON 经常暴露安全漏洞这个情况,Spring 选择 Jackson 作为默认 JSON 库还是很有道理的。