ITPub博客

首页 > 人工智能 > 人工智能 > 为什么 SpringBoot 一直坚持用 Jackson 作为默认序列化库 ?

为什么 SpringBoot 一直坚持用 Jackson 作为默认序列化库 ?

人工智能 作者:HackMind 时间:2026-08-05 16:45:13 1 删除 编辑
大家好,我是锋哥。

做过 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 框架来说,“整体稳妥”往往比“某个指标最快”更重要。

    一次请求是怎样变成 JSON 的

    Spring MVC 并不是在 Controller 里偷偷调用 Jackson。真正负责转换的是 HTTP 消息转换器:它拿到 Controller 返回的对象,找到合适的 JSON 映射器,再把结果写入 HTTP 响应。

    反过来也一样:前端提交 JSON 时,Jackson 会把请求体转换成 Java 对象,然后再交给 Controller。开发者只需要关心业务对象,不必重复处理 JSON 字符串。

    只要项目引入 Web Starter,通常就会间接得到 JSON Starter 和 Jackson。Spring Boot 还会根据类路径自动配置映射器、模块和消息转换器,这也是我们几乎“零配置就能用”的原因。

    Jackson 到底好在哪里

    1. 三种常用方式都支持

    Jackson 不只会做 Java 对象和 JSON 之间的转换。它同时提供三种处理方式:

    • 数据绑定 :直接把  User  转成 JSON,也是业务项目最常见的方式。

    • 树模型 :用  JsonNode  读取结构不固定的 JSON,像操作一棵树。

    • 流式处理 :逐个读取或写入字段,适合大文件和低内存场景。

    普通接口图省心,复杂数据要灵活,大数据量又要控制内存,Jackson 基本都能接得住。

    2. 对 Java 类型的理解比较深

    日期、枚举、泛型、Record、集合、Optional、多态对象,这些在真实项目里很常见。Jackson 不但能处理,还能通过模块扩展能力。例如日期时间有专门模块,Kotlin 也有对应支持,不需要每个团队重新造轮子。

    3. 配置细,但不强迫你配置

    简单项目开箱即用,复杂项目又可以通过注解、配置项、自定义序列化器和模块精确控制。比如隐藏密码字段、修改返回字段名、统一日期格式,都能在比较合适的位置完成。

    4. 性能够用,而且足够稳定

    Jackson 未必在所有基准测试中永远最快,但它的吞吐、内存占用和启动成本长期处在主流水平。更重要的是,它经过了大量生产系统验证。对多数 Web API 来说,数据库和网络通常比 JSON 转换更容易成为瓶颈。

    5. Spring 生态已经围着它铺好了路

    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 中进一步定制 Jackson 3

          如果配置文件不能满足需求,可以在 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 序列化配置  */ @Configuration public  class  JacksonConfig {
                 /**      * 统一调整 Spring Boot 自动创建的 JsonMapper      *      *  @return JsonMapper 构建器自定义器      */      @Bean      public 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 转换器后,这些代码不会自动变成另一套库的写法。

            1. 切换为 Gson

            先引入 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 序列化配置  */ @Configuration public  class  GsonConfig {
                       /**      * 配置 Gson 的全局序列化行为      *      *  @return Gson 构建器自定义器      */      @Bean      public GsonBuilderCustomizer gsonBuilderCustomizer() {          return builder -> builder                  // 输出值为 null 的字段                 .serializeNulls()                  // 禁止转义 HTML 字符                 .disableHtmlEscaping();     } }

                  2. 切换为 JSON-B

                  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 注解。

                      3. 切换为 Fastjson2

                      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 消息转换器配置  */ @Configuration public  class  Fastjson2Config  implements  WebMvcConfigurer {
                               /**      * 使用 Fastjson2 替换默认的 JSON 消息转换器      *      *  @param builder 消息转换器构建器      */      @Override      public  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/ ,如需转载,请注明出处,否则将追究法律责任。

                          请登录后发表评论 登录
                          全部评论

                          注册时间:2020-06-15

                          • 博文量
                            10
                          • 访问量
                            2132