news 2026/4/18 3:25:31

50% 的 Java 程序员都不知道的 Jackson 高级用法!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
50% 的 Java 程序员都不知道的 Jackson 高级用法!

50% 的 Java 程序员都不知道的 Jackson 高级用法!

Jackson 是目前 Java 生态中使用最广泛的 JSON 序列化/反序列化库,但绝大多数人只用到了它的最基础功能(@JsonPropertyObjectMapper.readValue等),其实它还有非常多强大且实用的高级特性,能大幅提升代码质量、性能和可维护性。

下面列出10 个非常实用但使用率明显偏低的 Jackson 高级用法(2025–2026 视角),很多都是中高级开发者和架构师才会主动用到的。

1. @JsonAnyGetter + @JsonAnySetter(动态字段)

当 JSON 中有大量不确定字段,或者你想把 Map 字段“打平”到对象里时非常有用。

publicclassDynamicUser{privateStringname;privateMap<String,Object>extra=newLinkedHashMap<>();@JsonAnyGetterpublicMap<String,Object>getExtra(){returnextra;}@JsonAnySetterpublicvoidsetExtra(Stringkey,Objectvalue){extra.put(key,value);}}

效果
输入 JSON:{"name":"张三", "age":18, "city":"北京"}
对象中extra会自动包含agecity,而不需要提前定义所有字段。

2. @JsonUnwrapped(打平嵌套对象)

publicclassAddress{privateStringcity;privateStringstreet;}publicclassPerson{privateStringname;@JsonUnwrappedprivateAddressaddress;}

序列化后

{"name":"李四","city":"上海","street":"南京路"}

非常适合把嵌套对象“展平”到顶层,常见于 DTO 与数据库实体转换。

3. @JsonInclude + @JsonInclude.Include.NON_EMPTY / NON_DEFAULT

@JsonInclude(JsonInclude.Include.NON_EMPTY)publicclassUserDTO{privateStringname;privateStringemail;// null 不输出privateIntegerage=0;// 0 不输出(NON_EMPTY 对数字无效)privateList<String>roles=Collections.emptyList();// 空集合不输出}

常用变体

  • NON_NULL:null 不输出(最常见)
  • NON_EMPTY:空集合、空字符串、空 Map 不输出
  • NON_DEFAULT:默认值不输出(boolean false、int 0 等)

4. @JsonProperty.Access(读写控制)

publicclassUser{@JsonProperty(access=JsonProperty.Access.READ_ONLY)privateLongid;// 只读,序列化有,反序列化忽略@JsonProperty(access=JsonProperty.Access.WRITE_ONLY)privateStringpassword;// 只写,反序列化有,序列化忽略@JsonProperty(access=JsonProperty.Access.AUTO)// 默认privateStringusername;}

常用于:隐藏敏感字段、保护 id 不被前端修改等。

5. @JsonNaming(统一命名策略)

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)publicclassUserInfo{privateStringfirstName;privateStringlastLoginTime;}

输出

{"first_name":"张","last_login_time":"2025-12-01"}

支持的策略:

  • SnakeCaseStrategy(snake_case)
  • KebabCaseStrategy(kebab-case)
  • UpperCamelCaseStrategy(UpperCamelCase)
  • LowerCaseStrategy(全小写)

6. @JsonView(视图控制,按需返回字段)

publicclassViews{publicstaticclassPublic{}publicstaticclassInternalextendsPublic{}}publicclassUser{@JsonView(Views.Public.class)privateStringusername;@JsonView(Views.Internal.class)privateStringpassword;@JsonView(Views.Internal.class)privateStringphone;}

使用

ObjectMappermapper=newObjectMapper();mapper.writerWithView(Views.Public.class).writeValueAsString(user);// 只输出 username

非常适合不同接口返回不同字段集的场景(用户列表 vs 用户详情)。

7. @JsonFormat(自定义日期格式)

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")privateLocalDateTimecreateTime;

支持的类型:Date、LocalDate、LocalDateTime、Instant、ZonedDateTime 等。

8. @JsonRootName(根节点名称)

@JsonRootName("response")publicclassApiResult<T>{privateintcode;privateStringmsg;privateTdata;}

序列化后

{"response":{"code":200,"msg":"success","data":{...}}}

常用于统一响应结构。

9. Mix-in Annotations(不侵入实体类)

当你不能修改第三方类或想把注解放在 DTO 而不是实体时使用:

// Mix-in 类publicabstractclassUserMixIn{@JsonIgnorepublicabstractStringgetPassword();}// 配置ObjectMappermapper=newObjectMapper();mapper.addMixIn(User.class,UserMixIn.class);

效果:User 类本身不加任何注解,但序列化时 password 被忽略。

10. 自定义 Deserializer / Serializer(终极武器)

publicclassMoneyDeserializerextendsJsonDeserializer<BigDecimal>{@OverridepublicBigDecimaldeserialize(JsonParserp,DeserializationContextctxt)throwsIOException{Stringtext=p.getText();// 支持 "123.45", "¥123.45", "123,45" 等returnnewBigDecimal(text.replaceAll("[¥,]",""));}}@JsonDeserialize(using=MoneyDeserializer.class)privateBigDecimalamount;

快速总结:你最应该立刻掌握的 5 个

  1. @JsonAnyGetter+@JsonAnySetter—— 处理动态字段
  2. @JsonUnwrapped—— 打平嵌套对象
  3. @JsonView—— 接口返回字段控制
  4. Mix-in Annotations —— 不侵入第三方类
  5. 自定义 Deserializer —— 处理非标准格式(金额、枚举、日期等)

这些特性一旦熟练使用,能让你的 JSON 处理代码更优雅、更安全、维护成本更低。

你项目里现在用 Jackson 遇到过哪些最痛苦的场景?可以告诉我,我帮你针对性给出最优解法。

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

Shell脚本系统资源检查

Shell脚本&#xff1a;系统资源检查工具 功能说明 通过编写自动化脚本执行系统监控和批处理操作&#xff0c;检查关键系统资源状态。 适用场景 系统日常监控与巡检文件处理与备份定时任务调度基础网络配置运维自动化任务 优势特点 高度灵活性&#xff1a;可自定义检查项目…

作者头像 李华
网站建设 2026/4/16 22:34:11

工业显示屏:显示屏的背光模组

显示屏的背光模组 显示屏的背光模组。它是液晶显示器(LCD)技术的核心组件之一,其性能直接决定了屏幕的亮度、均匀性、色彩和功耗。 一、 背光模组是什么?为什么需要它? 定义:背光模组是为液晶面板提供高强度、高均匀度面光源的光学组件。 为什么需要:LCD面板中的液晶本…

作者头像 李华
网站建设 2026/4/1 23:56:35

Agent Loop:大模型 “能做事” 的核心机制

Agent Loop 是什么&#xff1f; Agent Loop 调用模型 → 判断是否要用工具 → 执行工具 → 把结果回喂给模型 → 重复 直到模型认为信息足够&#xff0c;输出最终答案为止。 它把大模型从“文本生成器”升级为“能完成任务的执行系统”。 还是用之前最简单执行 Bash 的 Agen…

作者头像 李华
网站建设 2026/4/11 7:50:19

AI大模型的原理及发展现状概要介绍

一、AI的分类 AI的核心目标是让机器能够执行通常需要人类智能的任务&#xff0c;例如语言理解、图像识别、复杂问题解决等。 • 早期阶段&#xff1a;以规则为基础的专家系统&#xff0c;依赖预设的逻辑和规则。 ——规则库 • 机器学习时代&#xff1a;通过数据训练模型&…

作者头像 李华
网站建设 2026/4/13 11:05:16

收藏 | AI小白必看:8种大模型记忆策略详解,轻松掌握上下文管理

本文详细介绍了8种常见的AI记忆策略&#xff0c;包括全量记忆、滑动窗口、相关性过滤、摘要/压缩、向量数据库、知识图谱、分层记忆和类OS内存管理。每种策略都分析了其原理、优缺点和适用场景&#xff0c;并提供了模拟代码帮助理解。这些策略旨在解决LLM上下文长度限制带来的问…

作者头像 李华