news 2026/5/6 14:30:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 的完整迁移清单,也可继续提问!

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

SkyWalking 入门实战:Spring Boot 应用性能监控从0到1

视频看了几百小时还迷糊&#xff1f;关注我&#xff0c;几分钟让你秒懂&#xff01; 一、为什么我们需要 SkyWalking&#xff1f; 在微服务架构越来越普及的今天&#xff0c;一个简单的业务请求可能要经过多个服务之间的调用。一旦系统出现性能瓶颈或异常&#xff0c;排查起来…

作者头像 李华
网站建设 2026/4/26 21:07:39

检索增强生成(RAG)如何赋能大语言模型循序渐进的探索?

检索增强生成&#xff08;RAG&#xff09;系统已迅速成为企业级应用的核心技术&#xff0c;它在企业搜索和智能聊天机器人等领域展现出巨大潜力。今天&#xff0c;我们将深入探讨RAG&#xff0c;从其基础概念出发&#xff0c;逐步剖析其工作原理和多样的架构&#xff0c;帮助您…

作者头像 李华
网站建设 2026/5/2 21:13:58

开题报告总被毙?虎贲等考 AI:三步搞定导师认可的学术蓝图

开题报告改了 N 版仍被导师打回&#xff0c;选题太泛没新意&#xff0c;文献综述像流水账&#xff0c;技术路线混乱看不懂…… 相信这是不少毕业生写开题报告时的崩溃瞬间。作为毕业论文的 “第一道门槛”&#xff0c;开题报告的质量直接决定后续研究能否顺利推进。虎贲等考 AI…

作者头像 李华
网站建设 2026/5/4 16:32:21

写论文软件哪个好?实测虎贲等考 AI:一站式搞定毕业论文全流程

毕业季的论文写作战场&#xff0c;选对工具等于成功了一半。“写论文软件哪个好” 的灵魂拷问&#xff0c;每年都会刷屏各大高校的互助群。市面上的论文工具要么功能单一&#xff0c;要么文献引用漏洞百出&#xff0c;要么查重结果与学校标准脱节。经过多轮实测对比&#xff0c…

作者头像 李华