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.mzph.cn/news/1163619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【好写作AI】法学“准律师”的智能卷宗:让AI帮你搞定引用与检索的脏活累活

好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/一、写法学论文的你&#xff0c;是否感觉自己像个“人形法律数据库”&#xff1f;为了一个脚注&#xff0c;在《民法典》的1260条里 “大海捞针” &#xff0c;最后发现引用的还是旧司法解释。裁判文书网一搜“高空抛物”…

leetcode 869. Reordered Power of 2 重新排序得到 2 的幂-耗时100

Problem: 869. Reordered Power of 2 重新排序得到 2 的幂 解题过程 耗时100%&#xff0c;2的幂个数有限&#xff0c;所以只需要枚举&#xff0c;统计每个2的幂的数字频次&#xff0c;以及n的数字频次&#xff0c;比较是否存在2的幂的频次和n的频次相同即可 首先求出2的幂&…

RNA-seq数据分析实战 | 2026年第2期,开启你的生信学习之旅

完成本门课程&#xff0c;学员无需写代码&#xff0c;即可完全基于 Galaxy 生信云平台进行 RNA-seq 数据分析&#xff0c;包括上游表达量矩阵的获得和下游发表级统计图表制作。随着测序技术的飞速发展&#xff0c;RNA-seq 已经成为生物医学研究的常规手段&#xff0c; 掌握 RNA…

AI实战篇:RAG评估从0到1落地,让你的检索增强生成系统能量化、能优化

我们是不是都踩过同一个坑&#xff1a;花数周搭建的RAG系统&#xff0c;上线后用户反馈“答非所问”“信息造假”&#xff1b;调整了chunk大小、换了向量模型&#xff0c;却说不清效果提升了多少&#xff1b;生产环境幻觉率忽高忽低&#xff0c;却找不到问题根源。这些问题的关…

从单细胞测序到人群大数据:一文读懂如何利用scRNA-seq与UK Biobank挖掘临床靶点

你是否思考过&#xff0c;在那些错综复杂的肠道神经丛里&#xff0c;胶质细胞真的只是维持结构的“配角”吗&#xff1f;过去我们总把它们看作一类整齐划一的辅助细胞&#xff0c;但最新的研究却打破了这种固有印象。2026年1月8日Neuron杂志发表了由Meenakshi Rao团队完成的研究…

【好写作AI】从“开挂”到“自强”:把AI变成你的私人学术健身教练

好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/一、两个平行宇宙&#xff1a;用同款AI&#xff0c;结不同果宇宙A&#xff08;摆烂版&#xff09;&#xff1a;小张把题目丢给AI&#xff0c;得到一篇流畅论文。答辩时&#xff0c;导师问&#xff1a;“请问你这里用的XX…

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

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

【好写作AI】别吵了!用AI写的论文,到底算谁的?一个灵魂拷问的终极回答

好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/一、当答辩委员扶了扶眼镜&#xff0c;问出那个致命问题… “同学&#xff0c;听说你这篇论文用了AI辅助&#xff0c;那么我想问&#xff1a;哪些部分是你的&#xff0c;哪些部分是机器的&#xff1f;”空气突然安静。这…

雷池WAF安装

干净的Ubuntu Server 24 # 下载并运行官方安装脚本 bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/manager.sh)"安装后&#xff0c;可以通过frp暴露到公网上 参考&#xff1a; https://blog.csdn.net/lpfasd123/article/details/156835633 ht…

【好写作AI】毕业季“分身术”:用AI把一天48小时的魔法变成现实

好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/一、毕业季的你&#xff0c;是否在扮演“时间扭曲者”&#xff1f;早上&#xff1a;修改论文第8稿&#xff0c;发现文献引用格式全乱。下午&#xff1a;奔赴一场重要的实习面试&#xff0c;路上还在背自我介绍。晚上&…

拥抱大模型:深入剖析 ReAct 的核心原理、技术架构及其对 AI 领域的深远影响

在人工智能的演进历程中&#xff0c;大语言模型展现出了令人惊叹的文本生成能力&#xff0c;但其“黑箱”特性也带来了显著挑战——模型经常产生看似合理但实际错误的“幻觉”回答&#xff0c;缺乏透明推理过程&#xff0c;且无法与外部世界交互获取实时信息。ReAct&#xff08…

5 款 AI 写论文哪个好?实测横评!虎贲等考 AI 凭硬核实力 C 位胜出

毕业季来临&#xff0c;“AI 写论文工具怎么选” 的提问刷爆学术社群。市面上的论文 AI 五花八门&#xff0c;但真正能兼顾学术严谨性、数据真实性、全流程适配性的工具却寥寥无几。作为深耕论文写作科普的测评博主&#xff0c;我耗时一周&#xff0c;对虎贲等考 AI、掌桥科研 …

【好写作AI】一次“氪金”,终身受益?这笔毕业季投资到底值不值?

好写作AI官方网址&#xff1a;https://www.haoxiezuo.cn/一、毕业预算&#xff0c;你是否这样分配&#xff1f;聚餐、拍照、毕业旅行&#xff1a;预算拉满&#xff0c;毫不犹豫。买正版软件、知识付费&#xff1a;眉头一皱&#xff0c;开始犹豫。“这钱花得值吗&#xff1f;有没…

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

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

虎贲等考 AI:重塑学术写作新范式,全流程智能赋能论文创作

在学术研究的赛道上&#xff0c;论文写作往往是一道横亘在无数科研人与学子面前的难关 —— 选题缺乏方向、文献梳理耗时费力、数据图表制作繁琐、查重降重反复碰壁、答辩准备手忙脚乱…… 这些痛点&#xff0c;曾让无数人在学术之路上步履维艰。 而今&#xff0c;虎贲等考 AI…

从Windows 10上为远程Linux上安装claude code环境

在本地Linux上启动Claude Code&#xff0c;让Claude Code执行下面指令&#xff1a; 先安装sshpass&#xff0c;本地Linux root密码XXXXconnect to remote ubuntu 24 ip 192.168.X.X, user root XXXX, setup 使用清华ubuntu镜像在远程Linux上为用户jiang 安装nvm&#xff0c;然…

Java IO 与 NIO:从 BIO 阻塞陷阱到 NIO 万级并发

文章目录&#x1f3af;&#x1f525; Java IO 与 NIO&#xff1a;从 BIO 阻塞陷阱到 NIO 万级并发&#xff08;实测 10 万 QPS 性能对比&#xff09;&#x1f31f;&#x1f30d; 引言&#xff1a;数字时代的“脉搏”与 IO 性能天花板&#x1f4ca;&#x1f4cb; 第一章&#xf…

新一代开源CRM系统源码功能全览,支持设定年度、季度、月度等多层级业绩指标

温馨提示&#xff1a;文末有资源获取方式 在数字经济时代&#xff0c;企业的销售能力与其数据整合及流程自动化水平紧密相关。一款旨在构建企业数字销售中枢的新一代CRM系统源码正式亮相。它超越了传统的客户信息记录&#xff0c;集成了从市场线索到现金收入的完整销售自动化能…

什么是 MCP?如何在 Spring Boot + LangChain4j 中落地实战?

如果说大模型是大脑&#xff0c;那么 MCP 就是它的神经末梢。它为 AI 提供了与外部工具、资源和服务交互的标准化方式&#xff0c;让 AI 能够访问最新数据、执行复杂操作&#xff0c;并与现有系统无缝集成。 你可以把 MCP 想象成 AI 应用的“USB 接口”。 就像 USB 为电脑连接…

60N02-ASEMI藏在电路里的“效率密码”

编辑&#xff1a;LL60N02-ASEMI藏在电路里的“效率密码”型号&#xff1a;60N02品牌&#xff1a;ASEMI沟道&#xff1a;NPN封装&#xff1a;TO-252漏源电流&#xff1a;60A漏源电压&#xff1a;20VRDS(on):6.0mΩ批号&#xff1a;最新引脚数量&#xff1a;8封装尺寸&#xff1a…