当前位置: 首页 > news >正文

Jackson 1.x核心用法与Spring 3.x集成

一、Jackson 1.x 核心使用方式

1. 基本依赖(Maven)

<dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-core-asl</artifactId><version>1.9.13</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency>

⚠️ 注意:-asl表示 “Apache Software License”,这是 Jackson 1.x 的命名惯例。


2. 基本序列化/反序列化

ObjectMappermapper=newObjectMapper();// 序列化Stringjson=mapper.writeValueAsString(user);// 反序列化Useruser=mapper.readValue(json,User.class);

3. 自定义序列化器(JsonSerializer)

publicclassDateJsonSerializerextendsJsonSerializer<Date>{@Overridepublicvoidserialize(Datedate,JsonGeneratorjgen,SerializerProviderprovider)throwsIOException,JsonProcessingException{SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");jgen.writeString(sdf.format(date));}}

4. 自定义反序列化器(JsonDeserializer)

publicclassDateJsonDeserializerextendsJsonDeserializer<Date>{@OverridepublicDatedeserialize(JsonParserjp,DeserializationContextctxt)throwsIOException,JsonProcessingException{try{returnnewSimpleDateFormat("yyyy-MM-dd").parse(jp.getText());}catch(ParseExceptione){thrownewRuntimeException(e);}}}

5. 使用注解绑定自定义逻辑

publicclassUser{privateStringname;@JsonSerialize(using=DateJsonSerializer.class)@JsonDeserialize(using=DateJsonDeserializer.class)privateDatebirthDate;// getters/setters}

✅ 这正是你贴出的@JsonSerialize@JsonDeserialize注解的核心用途。


6. 控制字段包含策略(通过@JsonSerialize(include=...)

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)publicclassUser{privateStringname;// 若为 null,则不输出privateIntegerage;// 若为 null,则不输出}

支持的Inclusion枚举值:

  • ALWAYS(默认)
  • NON_NULL
  • NON_DEFAULT
  • NON_EMPTY(1.9+)

🔥这是 Jackson 1.x 特有写法!Jackson 2.x 已废弃此用法。


二、在 Spring 项目中的集成(Spring 3.x 时代)

在 Spring Framework 3.x(2009–2013)中,Jackson 1.x 是默认的 JSON 处理引擎

1. 启用注解驱动的 MVC(自动注册 Jackson)

<!-- applicationContext.xml 或 spring-servlet.xml --><mvc:annotation-driven/>

Spring 会自动检测 classpath 中是否存在ObjectMapper

  • 如果存在org.codehaus.jackson.map.ObjectMapper→ 自动注册MappingJacksonHttpMessageConverter
  • 无需手动配置!

2. 手动配置(如需定制 ObjectMapper)

<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><propertyname="messageConverters"><list><beanclass="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"><propertyname="objectMapper"ref="customObjectMapper"/></bean></list></property></bean><beanid="customObjectMapper"class="org.codehaus.jackson.map.ObjectMapper"><!-- 可通过 setter 配置特性,但 Jackson 1.x 配置能力有限 --></bean>

⚠️ 注意类名:MappingJacksonHttpMessageConverter(没有 “2”)


3. 全局配置序列化行为(如忽略 null)

由于 Jackson 1.x 的ObjectMapper不支持直接设置SerializationConfig的 include 策略(像 2.x 那样),通常做法是:

方式一:在每个类上加注解
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)publicclassApiResponse{...}
方式二:自定义ObjectMapper并设置全局 serializer
publicclassCustomObjectMapperextendsObjectMapper{publicCustomObjectMapper(){// Jackson 1.x 无法直接设置全局 inclusion,需通过自定义 serializer 实现// 或升级到 1.9+ 并使用 setSerializationInclusion()this.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);}}

setSerializationInclusion()在 Jackson 1.7+ 引入,是全局控制的关键方法。

然后在 Spring 中注入:

<beanid="objectMapper"class="com.example.CustomObjectMapper"/><beanclass="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"><propertyname="objectMapper"ref="objectMapper"/></bean>

4. Controller 示例

@ControllerpublicclassUserController{@RequestMapping(value="/user",method=RequestMethod.GET,produces="application/json")@ResponseBodypublicUsergetUser(){Useruser=newUser();user.setName("Alice");user.setBirthDate(null);// 若配置 NON_NULL,则不会出现在 JSON 中returnuser;}}

返回 JSON(当birthDate = null且配置NON_NULL):

{"name":"Alice"}

三、Jackson 1.x 的局限性与注意事项

问题说明
包名冲突与 Jackson 2.x 完全不兼容,不能共存
配置能力弱全局配置选项少,很多需靠注解
Java 8 不支持无对LocalDateTimeOptional等的支持
已停止维护最后版本 1.9.13(2013 年),存在安全漏洞风险
Spring 4+ 不再支持Spring 4.0+ 移除了对 Jackson 1.x 的自动配置

四、迁移建议(如果你还在用)

  1. 升级到 Jackson 2.x + Spring Boot

    • 替换所有import org.codehaus.jackson...com.fasterxml.jackson...
    • @JsonSerialize(include=...)@JsonInclude(...)
    • 使用MappingJackson2HttpMessageConverter
  2. 若必须维护老系统

    • 锁定 Jackson 1.9.13 版本
    • 避免引入任何 Jackson 2.x 依赖(检查传递依赖)
    • 使用setSerializationInclusion()做全局配置

总结

组件Jackson 1.x 用法
序列化器继承JsonSerializer<T>,实现serialize()
反序列化器继承JsonDeserializer<T>,实现deserialize()
注解绑定@JsonSerialize(using=...)/@JsonDeserialize(using=...)
过滤 null@JsonSerialize(include = Inclusion.NON_NULL)mapper.setSerializationInclusion(...)
Spring 集成<mvc:annotation-driven />自动启用,转换器类名为MappingJacksonHttpMessageConverter

💡 虽然 Jackson 1.x 已过时,但理解它有助于维护遗留系统,并清晰认识 Jackson 2.x 的改进之处。

如需从 Jackson 1.x 升级到 2.x 的完整迁移清单,也可继续提问!

http://www.jsqmd.com/news/248388/

相关文章:

  • 【好写作AI】法学“准律师”的智能卷宗:让AI帮你搞定引用与检索的脏活累活
  • leetcode 869. Reordered Power of 2 重新排序得到 2 的幂-耗时100
  • RNA-seq数据分析实战 | 2026年第2期,开启你的生信学习之旅
  • AI实战篇:RAG评估从0到1落地,让你的检索增强生成系统能量化、能优化
  • 【好写作AI】从“开挂”到“自强”:把AI变成你的私人学术健身教练
  • 从单细胞测序到人群大数据:一文读懂如何利用scRNA-seq与UK Biobank挖掘临床靶点
  • 跟我学C++中统篇—STL中的bind
  • 【好写作AI】别吵了!用AI写的论文,到底算谁的?一个灵魂拷问的终极回答
  • 雷池WAF安装
  • 【好写作AI】毕业季“分身术”:用AI把一天48小时的魔法变成现实
  • 拥抱大模型:深入剖析 ReAct 的核心原理、技术架构及其对 AI 领域的深远影响
  • 5 款 AI 写论文哪个好?实测横评!虎贲等考 AI 凭硬核实力 C 位胜出
  • 【好写作AI】一次“氪金”,终身受益?这笔毕业季投资到底值不值?
  • 从单智能体到多智能体:九种模式教你搭建高效AI应用
  • 虎贲等考 AI:重塑学术写作新范式,全流程智能赋能论文创作
  • Java IO 与 NIO:从 BIO 阻塞陷阱到 NIO 万级并发
  • 从Windows 10上为远程Linux上安装claude code环境
  • 新一代开源CRM系统源码功能全览,支持设定年度、季度、月度等多层级业绩指标
  • 什么是 MCP?如何在 Spring Boot + LangChain4j 中落地实战?
  • 60N02-ASEMI藏在电路里的“效率密码”
  • 课程论文别再 “凑字数”!虎贲等考 AI:一键解锁高分学术答卷的秘密
  • 顶刊级科研绘图不用愁!虎贲等考 AI 一键解锁论文 “视觉加分密码”
  • 【Java毕设全套源码+文档】基于springboot的家校互联管理系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 全面解析 Agent Engineering 的十大工程维度:生产级 Agent 系统的炼成之路
  • 【Java毕设全套源码+文档】基于JavaWeb的毕业季旅游一站式定制服务平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • 为什么有了 LangChain,还需要 Spring AI?
  • 开题报告总被毙?虎贲等考 AI:三步搞定导师认可的学术蓝图
  • 人工磨问卷 VS 虎贲等考 AI:3 天工作量压缩到 30 分钟的调研革命
  • 【Java毕设全套源码+文档】基于Java Web的美容美发管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 数据不会说话?虎贲等考 AI 一键解锁 “学术数据翻译官” 模式