JSON Schema条件验证:根据枚举值动态控制属性必填性

JSON Schema条件验证:根据枚举值动态控制属性必填性

本教程深入探讨了json schema中如何实现基于特定枚举值的条件验证,以动态控制顶层属性的必填性。文章通过一个实际案例,详细解析了当一个属性(如`items`)的必填性取决于另一个嵌套属性(如`attributes.order_type`)的值时,如何正确使用`if`/`then`关键字在根级别进行条件判断,从而避免常见的验证错误,确保数据模型的灵活性与准确性。

引言

JSON Schema是描述JSON数据结构和格式的强大工具,广泛应用于API设计、数据验证和文档生成。在实际应用中,数据模型往往存在复杂的业务逻辑,其中某些字段的必填性可能依赖于其他字段的值。例如,在一个订单系统中,如果订单类型是“ORDER”,则必须包含商品列表(items),而其他订单类型(如“TRANSFER”)则不需要。这种“条件必填”的场景是JSON Schema条件验证功能的核心应用之一。

本文将通过一个具体的案例,详细讲解如何在JSON Schema中利用if/then关键字,根据嵌套属性的枚举值来动态控制顶层属性的必填性。

问题描述:条件必填属性的挑战

假设我们有一个订单(Order)的JSON数据模型,其中包含以下关键属性:

warehouse_id:仓库IDoperation_type:操作类型order_id:订单IDitems:商品列表,包含sku和quantity等信息。attributes:一个嵌套对象,包含订单的额外属性,其中最重要的是order_type(订单类型),它是一个枚举值(例如:”ORDER”, “TRANSFER”, “WITHDRAWAL”, “DISPOSAL”, “FRESH”)。

我们的业务需求是:

当attributes.order_type的值为”ORDER”时,顶层属性items必须存在且不能为空数组。当attributes.order_type的值为其他类型时,items属性是可选的,可以不存在或为空。

在尝试实现这一逻辑时,开发者常遇到的挑战是,如何正确地将条件逻辑放置在JSON Schema中,使其能够跨越层级,根据嵌套属性的值来影响顶层属性的验证。常见的错误尝试包括:

Qoder Qoder

阿里巴巴推出的AI编程工具

Qoder 270 查看详情 Qoder 将条件逻辑放在attributes属性的定义内部,试图在attributes的上下文中声明items为必填。然而,items是根级别的属性,不是attributes的子属性,因此这种做法会失败。在根级别的allOf中使用if,但if的properties中直接引用order_type,而没有指定其完整的嵌套路径,导致条件无法正确匹配。

JSON Schema条件逻辑:if/then/else

JSON Schema Draft 07及更高版本引入了if、then和else关键字,用于实现基于条件的模式验证。

if:定义一个条件模式。如果JSON数据满足if中定义的模式,则会应用then中定义的模式。then:当if条件满足时应用的模式。else:当if条件不满足时应用的模式(可选)。

理解这些关键字的关键在于,它们所定义的模式(包括properties、required等)都作用于当前正在被验证的JSON数据上下文。如果if/then位于根级别,那么它们就作用于整个JSON文档。如果它们位于某个属性的定义内部,则作用于该属性的值。

正确实现方案

为了解决上述问题,我们需要将条件逻辑放置在JSON Schema的根级别,并确保if条件能够准确地描述出attributes.order_type的嵌套路径和值。

以下是实现这一条件的完整JSON Schema示例:

{  "$schema": "http://json-schema.org/draft-07/schema#",  "$id": "http://json-schema.org/draft-07/schema#",  "title": "订单数据验证方案",  "type": "object",  "properties": {    "warehouse_id": {      "type": "string",      "description": "仓库ID"    },    "operation_type": {      "type": "string",      "description": "操作类型"    },    "order_id": {      "type": "number",      "description": "订单唯一标识符"    },    "items": {      "type": "array",      "description": "商品列表",      "minItems": 1,      "items": {        "type": "object",        "properties": {          "sku": {            "type": "string",            "minLength": 1,            "maxLength": 50,            "description": "商品SKU"          },          "quantity": {            "type": "integer",            "minimum": 1,            "description": "商品数量"          }        },        "required": ["sku", "quantity"],        "additionalProperties": false      }    },    "attributes": {      "type": "object",      "description": "订单附加属性",      "properties": {        "order_type": {          "type": "string",          "enum": ["ORDER", "TRANSFER", "WITHDRAWAL", "DISPOSAL", "FRESH"],          "description": "订单类型"        },        "etd": {          "type": "string",          "pattern": "^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])(?:T)(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])(?:Z)$",          "description": "预计离港日期/时间 (ISO 8601 UTC)"        },        "volume": {          "type": ["integer", "null"],          "minimum": 0,          "description": "订单总体积"        },        "typology": {          "type": ["string", "null"],          "enum": ["CONVEYABLE", "NON_CONVEYABLE"],          "description": "订单类型学 (仅限ORDER类型)"        }      },      "required": ["order_type", "etd"],      "additionalProperties": false    }  },  "required": [    "warehouse_id",    "operation_type",    "attributes"  ],  "additionalProperties": false,  "allOf": [    {      "if": {        "type": "object",        "properties": {          "attributes": {            "type": "object",            "properties": {              "order_type": { "const": "ORDER" }            },            "required": ["order_type"]          }        },        "required": ["attributes"]      },      "then": { "required": ["items"] }    }  ]}

关键解析:

allOf 关键字:我们使用allOf在根级别包含条件逻辑。allOf表示所有子模式都必须通过验证。if 条件:”if”: { … }:这个if块定义了条件。”properties”: { “attributes”: { … } }:这是关键所在。为了检查嵌套属性order_type的值,我们需要在if条件中模拟其完整的路径。这里,我们声明期望根对象有一个名为attributes的属性。”attributes”: { “type”: “object”, “properties”: { “order_type”: { “const”: “ORDER” } }, “required”: [“order_type”] }:在attributes的定义内部,我们进一步指定attributes必须是一个对象,且其order_type属性的值必须精确地是”ORDER”。”required”: [“order_type”]确保order_type属性本身存在。”required”: [“attributes”]:确保根对象中attributes属性本身是存在的,否则如果attributes不存在,if条件可能无法正确评估。then 规则:”then”: { “required”: [“items”] }:如果if条件(即attributes.order_type为”ORDER”)满足,那么then中定义的模式将被应用。在这里,我们简单地将根级别的items属性声明为必填。

以上就是JSON Schema条件验证:根据枚举值动态控制属性必填性的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 18:32:18
下一篇 2025年12月1日 18:32:39

相关推荐

  • 比特币有什么APP?比特币交易APP安装链接最新版

    比特币作为一种开创性的数字资产,其普及催生了众多相关的移动应用程序。这些应用的功能各异,涵盖了从实时市场数据追踪到便捷的资产兑换等多种需求。特别是在进行比特币的交易活动时,选择一个功能全面、操作流畅且安全可靠的应用程序至关重要。市面上有许多提供比特币交易服务的平台,它们各自开发了自己的移动应用版本,…

    2025年12月8日
    000
  • dogecoin在哪个交易所 dogecoin上线的十大交易所有哪些

    狗狗币(dogecoin)作为一种广受欢迎的加密货币,其交易活跃度一直备受关注。许多对狗狗币感兴趣的用户都在寻找合适的交易平台。全球有众多加密货币交易平台支持狗狗币的交易,它们提供了不同的交易对、流动性和服务。选择一个合适的交易所,对于参与狗狗币交易显得尤为重要。 支持Dogecoin交易的知名加密…

    2025年12月8日 好文分享
    000
  • 新手友好型数字货币交易所有哪些?2025年推荐榜单TOP8

    对于初入数字货币世界的新手而言,选择一个合适的交易平台是迈出成功第一步的关键。面对市场上琳琅满目的交易所,其复杂的界面、专业的术语和潜在的风险往往令人望而却步。一个新手友好型的交易所能够提供简洁直观的操作界面,丰富的教育资源和及时有效的客户支持,帮助用户快速熟悉交易流程,降低学习门槛,从而更安心地探…

    2025年12月8日 好文分享
    000
  • 2025年最具潜力的山寨币交易所TOP5

    探索加密货币市场,特别是山寨币的潜力,选择一个合适的交易平台至关重要。不同的交易所有其独特的优势,例如交易费用、可交易币种、安全措施以及用户体验。以下列出了一些在加密货币领域备受关注的交易所。 最具潜力的山寨币交易所 1. Binance Binance提供海量的山寨币选择,满足不同投资者的需求。该…

    2025年12月8日 好文分享
    000
  • 全球低手续费加密货币交易平台Top10推荐(2025最新榜单)

    建议选择手续费透明、支持交易量分级优惠及平台币折扣的平台,如OKX、Binance、Huobi等,比较实际交易成本并参考用户反馈,优先在小额交易中测试服务。 全球低手续费加密货币交易平台Top10推荐(2025最新榜单) 以下是基于综合评估全球主要加密货币交易平台的手续费、流动性、安全性等因素,为您…

    2025年12月8日 好文分享
    000
  • 小币种投资首选平台:Gate.io、OKX等新兴代币支持清单

    当前,数字资产领域正经历着前所未有的活跃期,其中新兴的代币项目以其巨大的增长潜力吸引着全球投资者的目光。这些处于早期阶段的加密资产,尽管波动性较高,但一旦项目成功落地并获得市场认可,其潜在回报可能非常可观。然而,与高收益伴随的是同等甚至更高的风险,深入研究项目基本面和市场动态变得尤为重要。对于希望参…

    2025年12月8日
    000
  • 哪个平台买狗狗币手续费最低又安全?(2025最新版)

    在数字资产交易领域,选择一个合适的平台至关重要,特别是对于像狗狗币这样波动性较高的资产。交易费用、平台安全性以及用户体验都是需要仔细考量的因素。不同的平台在这些方面提供了各具特色的服务,寻找一个既能降低交易成本又能保障资产安全的平台,是众多交易者共同的需求。 交易所排名 1.币安Binance   …

    2025年12月8日 好文分享
    000
  • dogecoin怎么交易买卖 2025热门交易所地址推荐

    数字货币交易平台是进行dogecoin等加密资产买卖的核心场所。这些平台提供用户界面、撮合交易引擎、安全的资金托管以及多样化的交易工具,使得全球各地的用户可以便捷地参与到加密市场的流动性中。对于希望买卖dogecoin或其他数字资产的用户而言,选择一个功能强大且可靠的交易平台至关重要。合适的平台需要…

    2025年12月8日 好文分享
    000
  • 抓住风口!这些暴涨的币或成下一波牛市引擎

    2025年下半年加密货币市场回暖,以下项目具备推动下一轮牛市潜力:1. 公链赛道中Solana(SOL)凭借Firedancer升级及生态活跃度提升表现亮眼;Toncoin(TON)依托Telegram整合和社交传播模式快速崛起;2. AI+区块链领域Render(RNDR)通过整合全球算力服务AI…

    2025年12月8日
    000
  • 狗狗币在哪里购买?2025买狗狗币的交易所盘点

    狗狗币,一种诞生于互联网文化并迅速获得全球关注的加密货币,其独特的社区驱动特性使其在数字资产领域占据了一席之地。对于希望获取狗狗币的参与者而言,选择一个合适的数字资产交易平台至关重要。市场上存在众多提供狗狗币交易服务的平台,它们在流动性、交易对、费用结构以及用户体验等方面各具特色。了解这些平台的具体…

    2025年12月8日 好文分享
    000
  • 2025最新RWA代币有哪些

    真实世界资产(RWA)代币化通过区块链技术将房地产、债券等实体资产转化为数字代币,提升流动性与可及性,并连接传统金融与DeFi生态。1.RWA被视为推动加密市场增长的关键驱动力;2.Ondo Finance(ONDO)代币化美债,提供美元本位收益;3.MANTRA(OM)构建合规Layer 1链,优…

    2025年12月8日
    000
  • 比特币是什么加密货币?由谁提出?算主流吗?

    比特币是加密货币领域的绝对主流资产,其市场主导地位、技术稳定性和全球接受度无可匹敌。它不仅是投资者的首选,也是Web3经济中的核心价值储存工具。尽管在功能多样性和交易效率上稍逊于以太坊等平台,比特币的“第一性”地位和品牌效应使其在可预见的未来仍将保持领先。 比特币主流交易平台官网推荐 币安Binan…

    2025年12月8日
    000
  • 币安币属于什么类型代币?谁主导发行?算主流币吗?

    bnb,全称binance coin,是全球领先数字资产交易平台之一——binance(币安)生态系统的原生数字资产。它最初于2017年通过首次代币发行(ico)问世,起初基于以太坊区块链发行,作为一种erc-20代币。其核心用途是为binance平台用户提供交易费用折扣。然而,随着binance生…

    2025年12月8日
    000
  • MEXC(抹茶)交易所官网入口 MEXC(抹茶)交易所新手教程

    mexc交易所是一个全球知名的加密货币交易平台,致力于为用户提供安全、便捷、高效的数字资产交易服务。平台支持广泛的加密货币种类,覆盖主流币、defi代币等,并以其快速的新币上线速度受到关注。mexc在全球多个国家和地区开展业务,拥有庞大的用户基础。 MEXC交易所自成立以来,凭借技术实力和产品创新,…

    2025年12月8日
    000
  • 狗狗币哪里买最正规?2025新手必看4大靠谱平台!

    数字货币市场的飞速发展,吸引了大量投资者的目光。狗狗币作为一种备受欢迎的加密货币,其交易平台的多样性也让新手投资者在选择时感到困惑。选择一个正规、可靠的交易平台,是确保交易安全和资产保值的基础。本文旨在介绍当前市场上一些较为知名的数字货币交易平台,分析其特点,帮助投资者更好地了解可供选择的交易场所。…

    2025年12月8日 好文分享
    000
  • 欧亿okx官网入口指南:新手快速注册

    欧易okx是全球数字资产交易服务平台,为全球用户提供比特币、以太坊等多种数字资产的币币、衍生品交易服务。平台致力于提供安全、稳定、高效的交易环境,服务全球众多国家和地区的数千万用户。 官方下载地址: 欧易OKX详细介绍 1. 平台概况与安全性 欧易OKX自成立以来,发展成为全球领先的数字资产交易平台…

    2025年12月8日
    000
  • 普通人进入币圈真的可以赚到钱吗

    普通人进入币圈可以赚到钱,但需具备充分认知与风险承受能力。1.市场存在短期暴富的案例,但也伴随资产瞬间蒸发的风险;2.牛市周期中财富效应显著,但波动性巨大且难以预测;3.参与方式多样,包括短线交易、长期持有、挖矿及DeFi等,各自对应不同门槛和风险;4.成功关键在于持续学习项目知识、理性分析价值,并…

    2025年12月8日
    000
  • Web3时代来临,以太坊、狗狗币、比特币谁将成为最大赢家?

    随着Web3时代的到来,去中心化、区块链技术和用户主权的数据经济正在重塑互联网格局。以太坊(Ethereum)、狗狗币(Dogecoin)和比特币(Bitcoin)作为加密货币领域的代表性资产,各具特色,但其在Web3生态中的潜力与定位差异显著。以下分析三者在Web3时代的核心优势、局限性及可能的发…

    2025年12月8日 好文分享
    000
  • 炒币软件有哪些 热门买币软件排行榜

    数字资产交易的世界日益活跃,无数投资者投身其中。选择一款合适的交易软件,如同为航行挑选一艘坚固的船只。这些“炒币软件”不仅提供实时的行情数据,更是执行交易、管理资产的关键工具。市场上的选择繁多,功能各异,了解其中翘楚,对于希望进入或已身处这个领域的参与者来说,至关重要。从用户界面到安全性,从交易对种…

    2025年12月8日 好文分享
    000
  • 欧易常见问题解答:注册、充值、交易问题一网打尽

    欧易应用是连接全球加密资产市场的便捷工具。通过这款应用,用户可以方便地进行资产管理、交易操作,并有效解决在注册、充值、交易过程中可能遇到的各类常见问题。它提供了实时行情数据、专业的交易工具以及便捷的客户服务入口,帮助用户更高效地参与数字资产活动。 为了确保您下载的应用安全可靠,推荐始终通过欧易官方渠…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信