news 2026/6/22 10:14:43

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/6/13 10:06:49

【好写作AI】论文指导进入2.0时代:当你的导师,遇见你的AI助手

好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/一、从“导师恐惧症”到“高效协作”&#xff0c;只差一个好写作AI 还记得那些“经典场面”吗&#xff1f;预约导师前&#xff0c;把草稿改了八遍&#xff0c;依然觉得是“学术垃圾”&#xff0c;不敢敲门。导师问&#…

作者头像 李华
网站建设 2026/6/18 1:32:36

为什么有了 LangChain,还需要 Spring AI?

一位学员在最近AI Agent开发工程师岗位的面试中&#xff0c;面试官抛出了一个非常有意思的问题&#xff1a;“为什么有了 LangChain&#xff0c;还需要 Spring AI&#xff1f;”今天&#xff0c;我们就来深度拆解一下&#xff0c;为什么在 Java 开发者和企业级后端架构的视野里…

作者头像 李华
网站建设 2026/6/13 21:45:53

跟我学C++中统篇—STL中的bind

一、标准库中的函数绑定 对C11标准比较熟悉的都知道&#xff0c;标准库中提供了一个函数模板std::bind&#xff0c;用于将可调用对象&#xff08;函数&#xff0c;仿函数、函数指针、lambda表达式及函数对象等&#xff09;与一组参数绑定&#xff0c;然后形成一个新的可调用对象…

作者头像 李华
网站建设 2026/6/21 19:59:17

【Java毕设源码分享】基于springboot+vue的郑州旅游景点智能推荐系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

作者头像 李华
网站建设 2026/6/10 14:46:33

解锁学术新姿势:书匠策AI带你玩转文献综述写作魔法

在学术写作的浩瀚宇宙中&#xff0c;文献综述就像是一张导航图&#xff0c;指引着研究者穿越知识的海洋&#xff0c;避免重复造轮子的尴尬&#xff0c;直抵研究的核心地带。但你是否曾为堆积如山的文献资料感到头疼&#xff1f;是否在浩瀚的信息中迷失方向&#xff0c;不知从何…

作者头像 李华