bigywater.tech
Spring · 165

Jackson 2 与 Jackson 3:序列化吞吐

Spring Boot 4 换成 Jackson 3 之后序列化和反序列化会变快还是变慢?这篇在同一个对象上用两套 Jackson 各跑一遍吞吐,并如实写出只测了一台机器、每种只跑了一次的限制。

980 字节
同一个订单对象两个版本序列化出来的 JSON 字节数,Jackson 3 的字段按字母序排列
109% 与 87%
序列化成 byte[] 时 Jackson 3 相对 Jackson 2 的吞吐:单线程 109%,4 线程 87%
100%
反序列化 readValue 单线程 Jackson 3 相对 Jackson 2 的吞吐

输出

实测 · 本机执行输出
  Jackson 2.21.5:JSON 字节数 980;样例前 120 字节:{"id":9001,"customer":{"id":42,"name":"张三","email":"zhangsan@example.com","vip":true},"status":"PAID","created":"202
  Jackson 3.1.5:JSON 字节数 980;样例前 120 字节:{"attrs":{"channel":"web","coupon":"WELCOME10","note":"请尽快发货"},"created":"2026-10-23T12:30:15","customer":{"em

大小一样,字段顺序不同。

吞吐

实测 · 本机执行输出
  序列化 writeValueAsBytes(Order):Jackson 2 单线程 472200 / 4 线程 1539000;Jackson 3 单线程 514700 / 4 线程 1339400;3 相对 2:单线程 109%,4 线程 87%
  序列化 writeValueAsString(Order):Jackson 2 单线程 369700 / 4 线程 1342400;Jackson 3 单线程 418400 / 4 线程 1085500;3 相对 2:单线程 113%,4 线程 81%
  反序列化 readValue(byte[], Order.class):Jackson 2 单线程 174900 / 4 线程 597600;Jackson 3 单线程 174200 / 4 线程 593100;3 相对 2:单线程 100%,4 线程 99%
  readTree(byte[]):Jackson 2 单线程 152600 / 4 线程 539600;Jackson 3 单线程 150300 / 4 线程 443000;3 相对 2:单线程 98%,4 线程 82%

序列化单线程 3 略快,多线程略慢;反序列化持平;差距大多在 20% 以内。

分步演示

Jackson 性能
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK 21.0.12(Homebrew) / Spring Boot 4.0.8(Spring Framework 7.0.9、Tomcat 11.0.24) / Spring Cloud 2025.1.3;用 javac 编译、java 直接运行,依赖由 Maven 从 Maven Central 解析;数字每次运行会有小幅抖动(Jackson 2.21.5:ObjectMapper 加 JavaTimeModule,关闭 WRITE_DATES_AS_TIMESTAMPS,关闭 FAIL_ON_UNKNOWN_PROPERTIES;Jackson 3.1.5:JsonMapper.builder().build();同一份 Order 模型,JDK 21,堆固定 1 GB;预热 4 秒,3 轮每轮 2 秒取中位数;4 线程是 4 个线程各自独立循环再求和;每个版本只跑了一个 JVM 进程)
    • 没有验证:多次独立运行之间的波动(4 线程的 81% 到 87% 是否稳定,没有重复确认);更大或更小的对象;JIT 编译参数与 GC 的影响;JMH 级别的严谨基准;带 @JsonView、多态类型信息的场景;Spring MVC 里整条请求链路上的差别;本机 CPU 核数对 4 线程结果的影响
    京ICP备2026067502号-1京公网安备11010502063487号