掌握Jackson:构建可动态适应任意JSON键的POJO

掌握Jackson:构建可动态适应任意JSON键的POJO

本教程旨在解决java应用中处理json数据时遇到的动态键名问题。当json响应的顶层键名不固定,而是根据请求参数变化时,传统的静态pojo结构将失效。文章详细介绍了如何利用jackson库的@jsonanysetter和@jsonanygetter注解,结合map数据结构,构建一个能够灵活解析和序列化任意动态json键的pojo,同时探讨了如何处理字段缺失和空值序列化的情况,从而提升应用的健壮性和适应性。

背景:动态JSON键的挑战

在与外部API集成时,我们经常会遇到JSON响应的结构不完全固定的情况。特别是当JSON对象的顶级键名不是预设的常量,而是根据请求参数动态生成时,传统的Java POJO(Plain Old Java Object)映射方式便会遇到挑战。

例如,考虑以下JSON响应结构,其中”EU”和”AU”是动态的键名,它们的值都是一个包含IndexCalendarDateResponseWrapper对象的列表:

{    "EU": [        {            "calId": "EU",            "calDate": "2022-11-01",            "prevBusinessDay": "2022-11-01",            "nextBusinessDay": "2022-11-01",            "businessDay": true,            "monthEndBusinessDay": false        }    ],    "AU": [        {            "calId": "AU",            "calDate": "2022-11-01",            "prevBusinessDay": "2022-11-01",            "nextBusinessDay": "2022-11-01",            "businessDay": true,            "monthEndBusinessDay": false        }    ]}

如果尝试使用以下静态POJO来映射,当JSON中的键名变为”JU”、”BU”等其他值时,该POJO将无法正确解析这些动态部分,导致数据丢失或解析失败。

@Data@AllArgsConstructor@NoArgsConstructorpublic class StaticIndexCalendarDateResponseBean {    @JsonProperty("EU")    private List EU;    @JsonProperty("AU")    private List AU;    // ... 如果有更多动态键,需要不断添加字段,不具备扩展性}

这种静态映射的局限性在于,它要求我们预知所有可能的顶级键名。然而,在实际应用中,这些键名可能由API请求路径参数决定,数量和名称都可能动态变化。

核心解决方案:利用Jackson的`@JsonAnySetter`和`@JsonAnyGetter`

为了解决动态JSON键的问题,我们可以利用Jackson库提供的@JsonAnySetter和@JsonAnyGetter注解。这两个注解允许POJO在反序列化时捕获所有未映射的JSON属性,并在序列化时将动态数据重新输出为JSON属性。

1. 使用`Map`存储动态数据

首先,我们需要在POJO中定义一个Map来存储那些动态的键值对。在本例中,键是字符串(如”EU”, “AU”),值是IndexCalendarDateResponseWrapper对象的列表。

MarsX MarsX

AI驱动快速构建App,低代码无代码开发,改变软件开发的游戏规则

MarsX 159 查看详情 MarsX

import com.fasterxml.jackson.annotation.JsonAnyGetter;import com.fasterxml.jackson.annotation.JsonAnySetter;import java.util.HashMap;import java.util.List;import java.util.Map;public class DynamicIndexCalendarDateResponseBean {    private Map<String, List> responseWrappers = new HashMap();    // ... 后续添加 @JsonAnySetter 和 @JsonAnyGetter 方法}

2. 使用`@JsonAnySetter`进行反序列化

@JsonAnySetter注解用于标记一个方法,该方法将接收JSON中所有未被其他字段显式映射的属性。当Jackson反序列化JSON时,如果遇到POJO中没有对应字段的属性,它会调用被@JsonAnySetter标记的方法,并将属性名作为String参数,属性值作为第二个参数(其类型应与Map的值类型兼容)传递给该方法。

    @JsonAnySetter    public void readResponseWrappers(String key, List value) {        responseWrappers.put(key, value);    }

通过这个方法,无论JSON中出现”EU”、”AU”、”JU”或任何其他键,只要其值是List类型,Jackson都能将其捕获并存储到responseWrappers这个Map中。

3. 使用`@JsonAnyGetter`进行序列化

为了能够将这个动态POJO重新序列化回JSON,并保持动态键的结构,我们需要使用@JsonAnyGetter注解。它标记一个方法,该方法返回一个Map,Jackson会遍历这个Map,将其中的键值对作为顶层属性添加到输出的JSON中。

    @JsonAnyGetter    public Map<String, List> writeResponseWrappers() {        return responseWrappers;    }

这样,当DynamicIndexCalendarDateResponseBean对象被序列化时,responseWrappers中存储的所有动态键值对都将以原始的JSON结构输出。

完整的动态POJO示例

结合上述注解,完整的动态POJO如下所示:

import com.fasterxml.jackson.annotation.JsonAnyGetter;import com.

以上就是掌握Jackson:构建可动态适应任意JSON键的POJO的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/865307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
选择最适合您的3D建模软件(从功能到用户友好性)
上一篇 2025年11月28日 01:56:35
Cypress中处理动态菜单:解决主菜单关闭导致子菜单无法点击的问题
下一篇 2025年11月28日 01:56:35

相关推荐

  • Vue3中如何实现checkbox-group多选框初始化选中状态与后端数据和输入框值的同步?

    Vue3 中 checkbox-group 组件初始化选中状态与后端数据及输入框值的同步 本文探讨如何在 Vue3 中使用 checkbox-group 组件,实现多选框的初始化选中状态与后端返回的数据以及对应的输入框值和状态同步。 解决方案:组合式 API 和 Axios 以下代码示例演示如何使用…

    2026年9月7日
    200
  • 大批

    Java数组是存储同类型多个值的便捷方式,它们基于索引,方便数据管理。本文介绍Java数组的基本操作。 一、数组声明与创建 声明数组使用以下语法: type[] arrayName; 其中type是数组元素的数据类型(例如int,String),arrayName是数组名称。 注意:声明仅定义数组的…

    2026年9月7日
    100
  • 文本超出两行如何自动展开并显示“展开”按钮?

    让文本超出两行自动展开,并显示“展开”按钮的技巧 本文介绍如何使用CSS和JavaScript实现文本超出两行时自动展开,并添加“展开”按钮的功能。 首先,利用CSS控制文本显示行数,并隐藏超出部分: .text-container { display: -webkit-box; -webkit-l…

    2026年9月7日
    000
  • 红果漫剧怎么查看漫画章节目录_红果漫剧章节目录显示设置

    首先确认是否在阅读界面隐藏了目录,可点击屏幕中央调出功能栏并选择“目录”按钮查看章节;若无效,返回漫画详情页的“章节列表”区域浏览,并下拉刷新确保内容同步;仍无法解决则进入“我的-设置”检查“阅读设置”中“显示章节目录”是否开启,关闭时需手动打开以恢复正常显示。 如果您在使用红果漫剧时无法查看漫画的…

    2026年9月7日
    000
  • 了解Java中的协方差和逆向

    java协变与逆变详解:提升泛型编程能力 1. Java协变 协变允许将派生类型赋值给基类型。简单来说,泛型类型在处理子类型时保持赋值兼容性。这在Java数组和泛型中常见。 示例: class Animal { void sound() { System.out.println(“Animal so…

    2026年9月7日
    000
  • Java用户输入(扫描仪)

    Java用户输入:Scanner类详解 java.util.Scanner 类是 Java 中用于获取用户输入的强大工具。 本示例演示如何使用 Scanner 类读取用户输入,并进行简单的计算。 package afterfeb13;import java.util.Scanner;public c…

    2026年9月7日
    100
  • 小红书商户版怎么认证_小红书商户版资质认证与审核流程

    首先完成小红书商家账号注册并登录,进入商家中心提交资质;接着上传清晰有效的营业执照、法人身份证及海外商家所需公证文件;根据品牌属性提供商标注册证或完整授权链证明,并按类目补充食品经营许可证等特殊资质;资料提交后等待3至7个工作日审核,期间不可修改内容;审核通过后签署电子协议并缴纳保证金及可能的技术服…

    2026年9月6日
    300
  • 大麦网官方在线购票平台入口 大麦网演出门票预订中心

    大麦网官方购票平台入口为https://www.damai.cn/,首页分类清晰,支持搜索艺人或演出,个人中心可管理订单与电子票,提供开售提醒功能。平台实行实名制购票、动态二维码验票及风控拦截,保障票务安全。同时支持APP、小程序和网页端多设备协同,实现扫码入场、座位预览与跨端同步。 大麦网官方在线…

    2026年9月6日
    100
  • 那些年我们开发的应用程序

    那些年我们开发的应用程序那些年我们开发的应用程序那些年我们开发的应用程序那些年我们开发的应用程序

    本文主要介绍了使用java和python语言在windows环境下开发的一些应用程序。所有的ui设计都是在无意识状态下创作的,灵感来源于生活。 weatherweather是一款由Java语言开发的天气预报应用程序,数据来源于Yahoo数据库。它支持22个国家的城市天气预报信息。 mp3_v2是一款…

    2026年9月6日 用户投稿
    200
  • Java的注释

    java注释:元数据与代码的桥梁 Java注释并非代码本身,而是为程序提供元数据的辅助信息。它们为JVM和编译器提供关于类、接口、方法和字段的附加数据。 注释语法: @annotationnamepublic class myclass{…} 内置Java注释: 立即学习“Java免费学习笔记(…

    2026年9月6日
    100
  • 怎么给手机获取root权限_手机root权限获取教程(轻松getroot权限)

    嗨,手机玩家们!想让你的手机玩出新花样吗?今天就教你怎么轻松获得root权限,让爱机焕然一新! 前期准备 在踏上root之路之前,记得先做好准备。保证手机电量充足,防止在root过程中因电力不足发生意外。同时,把手机里的关键数据备份一下,毕竟root操作存在一定的风险,以免数据丢失。另外,弄清楚自己…

    2026年9月6日
    000
  • 夸克AI怎么进行法律咨询_夸克AI法律文档分析与建议功能

    夸克AI怎么进行法律咨询_夸克AI法律文档分析与建议功能夸克AI怎么进行法律咨询_夸克AI法律文档分析与建议功能夸克AI怎么进行法律咨询_夸克AI法律文档分析与建议功能夸克AI怎么进行法律咨询_夸克AI法律文档分析与建议功能

    1、打开夸克App搜索“夸克AI法律咨询”,进入官方服务卡片并点击“进入法律助手”;2、在法律助手界面选择“文档分析”,上传PDF或Word格式的法律文件,系统将在30秒内完成解析并生成结构化摘要与风险提示;3、点击“获取建议”按钮,AI将基于法律知识库提供适用条文与应对策略,如《民法典》第584条…

    2026年9月6日 用户投稿
    200
  • 美团外卖优惠券活动入口_美团外卖活动领取方法

    答案:无法领取美团外卖优惠券可能因活动规则变更或定位未开启。可通过App内“天天神券”每日8点抢券,搜索“惊喜333”或“惊喜666”触发隐藏福利,完成任务中心签到、评价等任务获券,或通过微信群、公众号“小雪外卖”获取限时链接领取。所有优惠券均存入“我的-红包卡券-券包”,需在有效期内使用。 如果您…

    2026年9月6日
    100
  • 高温对 CPU 性能与寿命的影响:长期负载测试

    高温会显著影响CPU性能与寿命。当温度升高,CPU触发降频以保护硬件,导致处理速度下降;同时电阻增加使指令延迟上升,系统稳定性降低,可能出现崩溃或关机。长期高温运行还会加速电子迁移和封装材料老化,缩短CPU实际使用寿命。通过AIDA64等工具进行长期负载测试可见:初期性能稳定,中期因温度上升出现降频…

    2026年9月6日
    400
  • 微软 Win11 全新的 AI 光标,满足用户和指定内容交互需求

    微软 Win11 全新的 AI 光标,满足用户和指定内容交互需求微软 Win11 全新的 AI 光标,满足用户和指定内容交互需求微软 Win11 全新的 AI 光标,满足用户和指定内容交互需求微软 Win11 全新的 AI 光标,满足用户和指定内容交互需求

    在windows 11系统的最新预览版本中,用户发现了一个名为aix(ai explorer)的新dll文件。从代码中可以看出,当用户通过ai explorer与屏幕互动时,系统将展示一个全新的ai光标。当用户按下alt+c快捷键时,页面会呈现office ai光标,使用户能够与屏幕上的数据进行交互…

    2026年9月6日 用户投稿
    100
  • 《赤痕:夜之仪式》官方公布续作《赤痕:绯红契约》

    《赤痕:夜之仪式》官方公布续作《赤痕:绯红契约》《赤痕:夜之仪式》官方公布续作《赤痕:绯红契约》《赤痕:夜之仪式》官方公布续作《赤痕:绯红契约》《赤痕:夜之仪式》官方公布续作《赤痕:绯红契约》

    《赤痕:夜之仪式》的开发商 ArtPlay 与发行商 505 Games 在索尼 State of Play 发布会上正式公布续作《赤痕:绯红契约(Bloodstained: The Scarlet Engagement )》,新作将于 2026 年推出,登陆 PC Steam、PS5 与 Xbox…

    2026年9月6日 用户投稿
    100
  • 各种版本QT下载地址与VS2017+QT5.13.2环境搭建过程

    想要获取各种版本的qt及其相关工具的下载地址吗?以下是详细的链接和搭建环境的指南。 所有Qt版本下载地址: https://www.php.cn/link/1c7640494d7b763e2f1521e08075cf61 所有Qt Creator下载地址: https://www.php.cn/li…

    2026年9月6日
    100
  • 《合金装备3 食蛇者 重制版》将加入全新在线模式“FOX HUNT”

    《合金装备3 食蛇者 重制版》将加入全新在线模式“FOX HUNT”《合金装备3 食蛇者 重制版》将加入全新在线模式“FOX HUNT”《合金装备3 食蛇者 重制版》将加入全新在线模式“FOX HUNT”《合金装备3 食蛇者 重制版》将加入全新在线模式“FOX HUNT”

    《合金装备3 食蛇者 重制版》在今晚konami的特别节目中公开了一些新情报。 首先是XBOX版将会加入与《炸弹人》的联动内容,此前发表过PS5版和PC版将与《捉猴啦》进行联动。算是给XBOX玩家做一些补偿。 视频:https://www.bilibili.com/video/BV1JHMAzLEM…

    2026年9月6日 用户投稿
    100
  • Maven仓库配置中和标签如何作用?

    深入理解Maven仓库配置:enabled和updatePolicy标签 Maven的仓库配置对于依赖管理至关重要,其中和标签扮演着关键角色。本文将详细解释这两个标签在Maven repositories配置中的作用。 标签:启用或禁用仓库 标签控制Maven是否在构建过程中使用指定的仓库。其值只有…

    2026年9月6日
    600
  • Maven仓库的Enabled和UpdatePolicy标签究竟有何作用?

    深入理解Maven仓库的enabled和updatePolicy标签 本文将详细解释Maven仓库配置中的enabled和updatePolicy标签的用途和作用,帮助您更好地管理Maven依赖。 enabled标签:仓库启用状态 enabled标签用于控制Maven仓库的启用状态。其值为布尔值,默…

    2026年9月6日
    100

发表回复

登录后才能评论
关注微信