做过 Spring Boot 接口开发的人,大概都见过这样的代码:
@GetMapping("/users/1")public User getUser() { return new User(1L, "锋哥");}方法明明返回的是一个 Java 对象,浏览器收到的却是 JSON。我们没有手动拼字符串,也没有主动调用序列化方法,这件事是谁做的?
答案通常就是 Jackson。
先说结论:默认不等于唯一
一次请求是怎样变成 JSON 的
Jackson 到底好在哪里
几段真正用得上的代码
和其他序列化库比一比
如何配置其他序列化库
Jackson 长期以来都是 Spring Boot 首选和默认的 JSON 库,而不是唯一能用的库
。Spring Boot 3 默认使用 Jackson 2,并自动创建
ObjectMapper
;到了 Spring Boot 4,默认版本已经升级为 Jackson 3,核心入口也变成了不可变的
JsonMapper
。名字和部分 API 虽然变了,但 Spring 对 Jackson 的选择没有变。
这不是因为 Jackson 在每一项测试里都必须拿第一,而是因为它在功能、性能、扩展能力、兼容性和社区生态之间,做到了很难得的平衡。对于一个通用 Web 框架来说,“整体稳妥”往往比“某个指标最快”更重要。
Spring MVC 并不是在 Controller 里偷偷调用 Jackson。真正负责转换的是 HTTP 消息转换器:它拿到 Controller 返回的对象,找到合适的 JSON 映射器,再把结果写入 HTTP 响应。

反过来也一样:前端提交 JSON 时,Jackson 会把请求体转换成 Java 对象,然后再交给 Controller。开发者只需要关心业务对象,不必重复处理 JSON 字符串。
只要项目引入 Web Starter,通常就会间接得到 JSON Starter 和 Jackson。Spring Boot 还会根据类路径自动配置映射器、模块和消息转换器,这也是我们几乎“零配置就能用”的原因。
Jackson 不只会做 Java 对象和 JSON 之间的转换。它同时提供三种处理方式:
数据绑定
:直接把
User
转成 JSON,也是业务项目最常见的方式。
树模型
:用
JsonNode
读取结构不固定的 JSON,像操作一棵树。
流式处理 :逐个读取或写入字段,适合大文件和低内存场景。
普通接口图省心,复杂数据要灵活,大数据量又要控制内存,Jackson 基本都能接得住。
日期、枚举、泛型、Record、集合、Optional、多态对象,这些在真实项目里很常见。Jackson 不但能处理,还能通过模块扩展能力。例如日期时间有专门模块,Kotlin 也有对应支持,不需要每个团队重新造轮子。
简单项目开箱即用,复杂项目又可以通过注解、配置项、自定义序列化器和模块精确控制。比如隐藏密码字段、修改返回字段名、统一日期格式,都能在比较合适的位置完成。
Jackson 未必在所有基准测试中永远最快,但它的吞吐、内存占用和启动成本长期处在主流水平。更重要的是,它经过了大量生产系统验证。对多数 Web API 来说,数据库和网络通常比 JSON 转换更容易成为瓶颈。
Spring MVC、WebFlux、消息转换、测试工具以及大量第三方组件都能自然地和 Jackson 配合。选用默认方案,意味着更少的适配代码、更容易查到资料,也更不容易在框架升级时踩到边角问题。
下面的写法同时适用于常见的 Jackson 2/3 项目,注解让 JSON 规则直接跟着数据模型走:
import com.fasterxml.jackson. annotation.JsonFormat;import com.fasterxml.jackson. annotation.JsonIgnore;import com.fasterxml.jackson. annotation.JsonProperty;import java.time.LocalDateTime;/*** 用户接口响应对象*/public record UserResponse(Long id,@JsonProperty( "user_name" ) String username,@JsonIgnore String password,@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" )LocalDateTime createdAt) {}
返回结果会接近下面这样,密码不会出现在响应里:
{ "id": 1, "user_name": "小锋", "createdAt": "2026-08-03 17:25:17"}
不少全局规则不需要写 Java 配置,放在
application.yml
里更直观:
spring: jackson: # 日期时间统一使用易读格式 date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai default-property-inclusion: non_null serialization: # 接口返回日期,不使用时间戳 write-dates-as-timestamps: false
如果配置文件不能满足需求,可以在 Spring Boot 4 中提供自定义器。它会修改框架自动创建的
JsonMapper
,不需要自己接管整套自动配置。
import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer;import org.springframework.context. annotation.Bean;import org.springframework.context. annotation.Configuration;import tools.jackson.databind.SerializationFeature;/*** Jackson 序列化配置*/@Configurationpublic class JacksonConfig {/*** 统一调整 Spring Boot 自动创建的 JsonMapper** @return JsonMapper 构建器自定义器*/@Beanpublic JsonMapperBuilderCustomizer jsonMapperCustomizer() {return builder -> builder// 禁止把日期写成数字时间戳.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);}}
如果项目仍是 Spring Boot 3,对应的常用扩展点是
Jackson2ObjectMapperBuilderCustomizer
,核心对象则是
ObjectMapper
。升级时要注意区分版本,不要直接复制不匹配的代码。
Gson:轻巧、直观,上手很快。 小工具、简单客户端或数据结构稳定的项目,用 Gson 会很舒服。它的 API 比较克制,不过在复杂多态、精细化定制和 Spring 生态集成方面,通常没有 Jackson 丰富。
Fastjson2:重视吞吐,也很贴近国内开发者。 它在不少性能场景里表现亮眼,API 也容易理解。如果项目确实有高强度 JSON 处理需求,可以基于自己的真实数据做基准测试。需要注意的是,替换 Spring Boot 默认方案后,要自己检查消息转换器、第三方组件和升级兼容性。讨论安全问题时也应区分旧版 Fastjson 与重新设计的 Fastjson2,不能简单混为一谈。
JSON-B:标准化是最大亮点。 JSON-B 属于 Jakarta 标准,更适合看重规范和实现可替换性的团队。Spring Boot 同样能自动配置它,但从现有资料、扩展模块和 Spring 项目使用惯例来看,Jackson 仍然更成熟。
Kryo:很快,但不是同一条赛道。 Kryo 主要面向 Java 对象的二进制序列化,适合缓存、RPC 等内部场景,不适合直接替代面向浏览器和开放接口的 JSON。
简单概括:Gson 胜在轻巧,Fastjson2 偏重速度,JSON-B 强调标准,Jackson 则更像一个各方面都没有明显短板的“全能选手”。这正符合 Spring Boot 默认组件的选型逻辑。
Spring Boot 并没有把 Jackson 焊死在框架里。以 Spring Boot 4 为例,Gson 和 JSON-B 都有官方 Starter 与自动配置支持;Fastjson2 没有 Spring Boot 官方自动配置,需要手动替换 HTTP 消息转换器。
切换之前最好先检查两件事:项目是否使用了
@JsonIgnore
、
@JsonProperty
等 Jackson 专属注解,以及第三方组件是否直接依赖
JsonMapper
。换掉 HTTP 转换器后,这些代码不会自动变成另一套库的写法。
先引入 Spring Boot 4 提供的 Gson Starter。依赖版本由 Spring Boot 统一管理,不需要单独填写:
<!-- 使用 Gson 处理 JSON --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-gson</artifactId></dependency>
然后指定 Spring MVC 优先使用 Gson:
spring: http: converters: # 将 MVC 的首选 JSON 映射器切换为 Gson preferred-json-mapper: gson gson: # 统一日期时间输出格式 date-format: yyyy-MM-dd HH:mm:ss
当 Gson 位于类路径中时,Spring Boot 会自动创建
Gson
Bean。项目需要更细的规则时,可以提供一个
GsonBuilderCustomizer
:
import org.springframework.boot.gson.autoconfigure.GsonBuilderCustomizer;import org.springframework.context. annotation.Bean;import org.springframework.context. annotation.Configuration;/*** Gson 序列化配置*/@Configurationpublic class GsonConfig {/*** 配置 Gson 的全局序列化行为** @return Gson 构建器自定义器*/@Beanpublic GsonBuilderCustomizer gsonBuilderCustomizer() {return builder -> builder// 输出值为 null 的字段.serializeNulls()// 禁止转义 HTML 字符.disableHtmlEscaping();}}
JSON-B 的配置更接近“按 Jakarta 标准编程”。Spring Boot 4 推荐使用由 Eclipse Yasson 提供实现的 Starter:
<!-- 使用 Jakarta JSON-B 标准处理 JSON --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jsonb</artifactId></dependency>
再把首选映射器改为
jsonb
:
spring: http: converters: # 将 MVC 的首选 JSON 映射器切换为 JSON-B preferred-json-mapper: jsonb
需要控制字段名或日期格式时,应改用
@JsonbProperty
、
@JsonbDateFormat
等 JSON-B 注解,而不是继续使用 Jackson 注解。
Fastjson2 需要引入核心库和 Spring 扩展。它不由 Spring Boot 管理版本,示例中的版本变量应在项目中锁定为经过测试的稳定版本:
<!-- Fastjson2 核心库 -->< dependency >< groupId >com.alibaba.fastjson2 </ groupId >< artifactId >fastjson2 </ artifactId >< version >${fastjson2.version} </ version ></ dependency ><!-- Fastjson2 的 Spring MVC 扩展 -->< dependency >< groupId >com.alibaba.fastjson2 </ groupId >< artifactId >fastjson2-extension </ artifactId >< version >${fastjson2.version} </ version ></ dependency >
Spring Boot 4 使用 Spring Framework 7,可以通过新的构建器 API 替换默认 JSON 转换器:
import com.alibaba.fastjson2.support.config.FastJsonConfig;import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter;import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.HttpMessageConverters;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** Fastjson2 消息转换器配置*/@Configurationpublic class Fastjson2Config implements WebMvcConfigurer {/*** 使用 Fastjson2 替换默认的 JSON 消息转换器** @param builder 消息转换器构建器*/@Overridepublic void configureMessageConverters (HttpMessageConverters.ServerBuilder builder) {FastJsonConfig config = new FastJsonConfig();// 统一日期时间输出格式config.setDateFormat( "yyyy-MM-dd HH:mm:ss");FastJsonHttpMessageConverter converter =new FastJsonHttpMessageConverter();converter.setFastJsonConfig(config);// 注册为 Spring MVC 使用的 JSON 转换器builder.jsonMessageConverter(converter);}}
如果项目使用 Spring Boot 3 / Spring Framework 6,配置方法仍是操作
List<HttpMessageConverter<?>>
,不能直接照搬上面的 Spring 7 写法。Fastjson2 的 Spring 适配 API 也可能随版本变化,升级前应以对应版本的官方文档为准。
无论换成哪一种库,都建议至少回归测试日期、枚举、空值、泛型集合和异常响应。真正容易出问题的往往不是普通字符串,而是这些边界数据。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049847/viewspace-3178267/ ,如需转载,请注明出处,否则将追究法律责任。