news 2026/3/26 15:16:51

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/3/24 9:39:27

9 款 AI 写论文哪个好?深度实测:虎贲等考 AI 凭硬核实力 C 位出道

毕业季来临&#xff0c;AI 写论文工具成了毕业生的 “香饽饽”。市面上的工具五花八门&#xff0c;功能参差不齐&#xff0c;到底哪款才是真正的学术救星&#xff1f;作为深耕论文写作科普的测评博主&#xff0c;我耗时两周&#xff0c;对虎贲等考 AI、图灵论文 AI 写作助手、J…

作者头像 李华
网站建设 2026/3/25 2:47:46

【Java毕设源码分享】基于springboot+Java Web的美容美发管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

作者头像 李华
网站建设 2026/3/20 9:56:24

顶刊Nature测评推荐:TOP5学术AI大模型,不同科研场景如何选择如何使用?

现在的AI发展太快了,对于我们做学术搞研究的同仁来说的确是大好事,但如果我们花费大量时间在纠结选择以及自我困难化AI的学习,把AI的学习和使用当成是独立的另外一个学科来对待,花费大量时间去学习去研究,反而会浪费很多时间,效果也并不会好。 以七哥的使用经验,建议是…

作者头像 李华