news 2026/10/15 17:26:34

Jackson 1.x到2.x的演进与Spring集成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jackson 1.x到2.x的演进与Spring集成

Jackson 从 1.x 到 2.x 的演进,不仅是一次技术升级,更深刻影响了 Spring 生态(尤其是 Spring MVC 和 Spring Boot)的 JSON 处理方式。下面从Jackson 自身差异、Spring 对 Jackson 的集成变迁、实际开发中的迁移注意事项三个维度,系统梳理这一历程。


一、Jackson 1.x vs 2.x:核心差异回顾(精要版)

维度Jackson 1.x (org.codehaus.jackson)Jackson 2.x (com.fasterxml.jackson)
包名org.codehaus.jackson.*com.fasterxml.jackson.*
模块化核心 + mapper 混合拆分为core/annotations/databind
注解位置org.codehaus.jackson.map.annotate.*com.fasterxml.jackson.databind.annotation.*
过滤 null@JsonSerialize(include = Inclusion.NON_NULL)废弃→ 改用@JsonInclude(Include.NON_NULL)
异常体系JsonProcessingException等更细粒度(JsonParseException,DatabindException)
扩展性基础支持更强(支持自定义Module、AnnotationIntrospector等)
维护状态已停止(~2013)活跃维护(当前 2.17+)

✅关键结论:两者二进制不兼容,不能共存于 classpath(会冲突)。


二、Spring 项目中 Jackson 的集成变迁

1.Spring Framework 3.x 时代(~2010–2013)

  • 默认使用Jackson 1.x。
  • 需手动添加依赖:
    <dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency>
  • 在 Spring MVC 中启用 JSON:
    <mvc:annotation-driven/><!-- 自动检测 classpath 下的 Jackson 1.x -->

⚠️ 此时若想用 Jackson 2.x,需显式配置MappingJackson2HttpMessageConverter(名字带 “2” 就是为区分 1.x)。


2.Spring Framework 4.x 起(2013+):全面拥抱 Jackson 2.x

  • 默认且仅支持 Jackson 2.x。
  • 移除对 Jackson 1.x 的自动配置支持。
  • 新增核心类:
    • MappingJackson2HttpMessageConverter(取代旧的MappingJacksonHttpMessageConverter)
    • Jackson2ObjectMapperBuilder
  • 自动配置条件:classpath 存在com.fasterxml.jackson.databind.ObjectMapper
Spring Boot 的推动(2014+)
  • Spring Boot 1.0+ 默认内嵌 Jackson 2.x。
  • starter 依赖自动引入:
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 传递依赖 jackson-databind 2.x --></dependency>
  • 通过application.properties轻松配置:
    spring.jackson.serialization.write-dates-as-timestamps=false spring.jackson.default-property-inclusion=NON_NULL

✅从此,新项目几乎不再接触 Jackson 1.x。


3.Spring Boot 2.x / 3.x:深度集成与现代化

  • Jackson 2.9+ ~ 2.15+ 成为事实标准。
  • 支持 Java 8+ 特性(Optional,LocalDateTime等开箱即用)。
  • 通过Jackson2ObjectMapperBuilderCustomizer定制:
    @BeanpublicJackson2ObjectMapperBuilderCustomizerjsonCustomizer(){returnbuilder->builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);}
  • Spring Boot 3.x(基于 Jakarta EE 9+):
    • 包名从javax.*→jakarta.*
    • 但 Jackson 不受影响(仍用com.fasterxml.jackson)

三、实际开发中的关键差异与迁移要点

场景 1:自定义序列化器

Jackson 1.x(已过时):
importorg.codehaus.jackson.JsonGenerator;importorg.codehaus.jackson.map.JsonSerializer;importorg.codehaus.jackson.map.SerializerProvider;publicclassMySerializerextendsJsonSerializer<MyClass>{@Overridepublicvoidserialize(MyClassvalue,JsonGeneratorjgen,SerializerProviderprovider){jgen.writeString("custom");}}
Jackson 2.x(现代写法):
importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.SerializerProvider;publicclassMySerializerextendsJsonSerializer<MyClass>{@Overridepublicvoidserialize(MyClassvalue,JsonGeneratorgen,SerializerProviderserializers){gen.writeString("custom");}}

🔁只需改 import,逻辑几乎不变。


场景 2:注解使用变更

❌ Jackson 1.x 写法(在 2.x 中无效):
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)privateStringname;
✅ Jackson 2.x 正确写法:
@JsonInclude(JsonInclude.Include.NON_NULL)publicclassUser{privateStringname;}// 或字段级@JsonInclude(Include.NON_EMPTY)privateList<String>tags;

📌这是最常见的迁移错误!


场景 3:Spring 配置类变更

Spring 3.x + Jackson 1.x:
@BeanpublicMappingJacksonHttpMessageConverterjacksonConverter(){returnnewMappingJacksonHttpMessageConverter();}
Spring 4.x+ + Jackson 2.x:
@BeanpublicMappingJackson2HttpMessageConverterjackson2Converter(){returnnewMappingJackson2HttpMessageConverter();}

注意类名多了“2”!

但在 Spring Boot 中,通常无需手动配置,自动装配即可。


场景 4:依赖冲突排查

若项目同时引入了 Jackson 1.x 和 2.x(例如老 jar 传递依赖),会出现:

  • ClassNotFoundException
  • NoSuchMethodError
  • AbstractMethodError

解决方法:

# Maven 查看依赖树mvn dependency:tree|grepjackson# 排除旧版本<exclusion><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId></exclusion>

四、总结:演进脉络与最佳实践

时间线技术栈建议
2010–2013Spring 3.x + Jackson 1.x仅维护旧系统
2013–2016Spring 4.x + Jackson 2.x 过渡期主动迁移,替换包名和注解
2016 至今Spring Boot + Jackson 2.6+使用@JsonInclude,避免include属性
未来Spring Boot 3.x + Jackson 2.15+拥抱 Java 17+,利用新特性(record、sealed class)

✅ 最佳实践(现代 Spring Boot 项目):

  1. 不要手动管理 Jackson 依赖,由spring-boot-starter-web控制版本。
  2. 用@JsonInclude替代旧的include属性。
  3. 自定义序列化/反序列化时,继承StdSerializer/StdDeserializer(比直接继承基类更安全)。
  4. 全局配置优先使用application.yml,而非硬编码ObjectMapper。

如果你正在维护一个从 Spring 3.x 升级到 Spring Boot 的老系统,重点检查:

  • 所有import org.codehaus.jackson...→ 替换为com.fasterxml.jackson...
  • 所有@JsonSerialize(include=...)→ 改为@JsonInclude(...)
  • 确保 classpath没有残留 Jackson 1.x 的 jar

这样就能平滑过渡到现代 Jackson 2.x 生态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 23:43:21

让大模型更“懂”外部知识:RAG技术及未来发展综述

&#xff5c;引言 如何更好地结合外部数据&#xff0c;如何提升模型处理专业领域问题的可靠性&#xff0c;是大语言模型应用开发中值得不断思考的问题。针对此&#xff0c;微软亚洲研究院的研究员们提出了一种基于查询需求分层的 RAG 任务分类法&#xff0c;从显式事实、隐式事…

作者头像 李华
网站建设 2026/10/14 7:07:04

从单智能体到多智能体:九种模式教你搭建高效AI应用

想要构建一个智能体应用&#xff0c;最重要的是什么&#xff1f;可能很多人首先会想到要选择一个性能强大的大模型。这个回答没错&#xff0c;毕竟当前的LLM Based Agent哪能缺少LLM的支撑。但事实却是&#xff0c;很多基于先进大模型构建的智能体没能体现出应用效果&#xff0…

作者头像 李华
网站建设 2026/10/10 23:45:53

降重去 AI 双 buff 拉满!虎贲等考 AI 解锁论文 “隐形优化” 新姿势

当论文查重率飘红的焦虑&#xff0c;遇上 AIGC 检测的 “生死大考”&#xff0c;多少毕业生陷入 “改了又改&#xff0c;还是过不了关” 的死循环&#xff1f;市面上的降重工具要么是简单同义词替换&#xff0c;改完逻辑混乱&#xff1b;要么只能降重复率&#xff0c;AI 痕迹依…

作者头像 李华
网站建设 2026/10/10 23:43:12

【Java毕设源码分享】基于springboot+vue的智慧物业服务系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/12 4:23:06

在CentOS上快速安装NVM和Node.js 14:完整指南与优化方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务) &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1;个人微信&a…

作者头像 李华