Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
JSON Schema高级教程:基于嵌套属性的条件必填校验_创想鸟

JSON Schema高级教程:基于嵌套属性的条件必填校验

json schema高级教程:基于嵌套属性的条件必填校验

JSON Schema作为一种强大的数据结构描述语言,广泛应用于API请求体、配置文件等场景的数据验证。然而,在面对复杂的业务逻辑时,例如根据某个字段的值来动态地改变其他字段的必填性,尤其是当这些字段处于不同层级时,往往会遇到挑战。本文将详细阐述如何利用JSON Schema的条件关键字,实现基于嵌套属性的顶层属性条件必填校验。

问题场景:基于订单类型的商品列表必填

设想一个订单验证场景,我们有一个Order对象,其中包含attributes嵌套对象,而attributes中又有一个order_type字段。我们的需求是:

当attributes.order_type的值为”ORDER”时,顶层的items属性必须存在且非空。对于order_type的其他值(如”TRANSFER”、”WITHDRAWAL”等),items属性是可选的。

最初的尝试可能倾向于将条件逻辑放置在attributes属性的定义内部,例如在attributes的allOf数组中添加对items的required校验。然而,这种做法是无效的。JSON Schema中required关键字的作用域是其所在的当前JSON对象。这意味着,如果if/then块位于attributes的定义内部,其then块中的required只能作用于attributes自身的子属性,而无法影响到与attributes同级的items属性。

JSON Schema条件逻辑:if、then与allOf

为了解决这类问题,我们需要借助JSON Schema提供的条件关键字:

if: 定义一个子模式作为条件。如果数据实例符合if子模式,则应用then子模式。then: 当if条件满足时,需要应用的数据模式。allOf: 用于组合多个子模式。数据实例必须同时满足allOf数组中的所有子模式才能通过验证。

关键在于,if/then块的放置位置决定了其作用域。要使条件逻辑能够影响到与attributes同级的items属性,if/then块必须放置在顶层(根级别),与properties和required关键字处于同一层级。

博思AIPPT 博思AIPPT

博思AIPPT来了,海量PPT模板任选,零基础也能快速用AI制作PPT。

博思AIPPT 117 查看详情 博思AIPPT

解决方案:在根级别应用条件逻辑

正确的做法是,在主Schema的根级别添加一个allOf块,并在其中定义我们的条件逻辑。这个if条件需要能够“看到”并判断嵌套的attributes.order_type字段。

以下是实现上述需求的完整JSON Schema:

{  "$schema": "http://json-schema.org/draft-07/schema#",  "$id": "http://json-schema.org/draft-07/schema#",  "title": "Validaciones sobre el esquema Order",  "type": "object",  "properties": {    "warehouse_id": {      "type": [        "string"      ]    },    "operation_type": {      "type": [        "string"      ]    },    "order_id": {      "type": [        "number"      ]    },    "items": {      "type": [        "array"      ],      "minItems": 1,      "items": {        "type": [          "object"        ],        "properties": {          "sku": {            "type": [              "string"            ],            "minLength": 1,            "maxLength": 50          },          "quantity": {            "type": [              "integer"            ],            "minimum": 1          }        },        "required": [          "sku",          "quantity"        ],        "additionalProperties": false      }    },    "attributes": {      "type": [        "object"      ],      "properties": {        "order_type": {          "type": [            "string"          ],          "enum": [            "ORDER",            "TRANSFER",            "WITHDRAWAL",            "DISPOSAL",            "FRESH"          ]        },        "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]|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)$"        },        "volume": {          "type": [            "integer", "null"          ],          "minimum": 0        },        "typology": true      },      "required": [        "order_type"      ],      "allOf": [        {          "if": {            "properties": {              "order_type": {                "const": "ORDER"              }            },            "required": [              "order_type"            ]          },          "then": {            "properties": {              "order_type": true,              "etd": true,              "volume": true,              "typology": {                "type": [                  "string", "null"                ],                "enum": [                  "CONVEYABLE",                  "NON_CONVEYABLE"                ]              }            },            "required": [              "order_type",              "etd"            ],            "additionalProperties": false          }        },        {          "if": {            "properties": {              "order_type": {                "const": "TRANSFER"              }            },            "required": [              "order_type"            ]          },          "then": {            "properties": {              "order_type": true,              "etd": true,              "volume": true            },            "required": [              "order_type",              "etd"            ],            "additionalProperties": false          }        },        {          "if": {            "properties": {              "order_type": {                "const": "WITHDRAWAL"              }            },            "required": [              "order_type"            ]          },          "then": {            "properties": {              "order_type": true,              "etd": true,              "volume": true            },            "required": [              "order_type",              "etd"            ],            "additionalProperties": false          }        },        {          "if": {            "properties": {              "order_type": {                "const": "DISPOSAL"              }            },            "required": [              "order_type"            ]          },          "then": {            "properties": {              "order_type": true,              "etd": true,              "volume": true            },            "required": [              "order_type",              "etd"            ],            "additionalProperties": false          }        }      ]    }  },  "required": [    "warehouse_id",    "operation_type",    "attributes"  ],  "additionalProperties": false,  "allOf": [    {      "if": {        "properties": {          "attributes": {            "properties": {              "order_type": { "const": "ORDER" }            },            "required": ["order_type"]          }        },        "required": ["attributes"]      },      "then": {        "required": ["items"]      }    }  ]}

核心Schema解析

让我们聚焦于解决问题的关键部分——位于根级别的allOf块:

  "allOf": [    {      "if": {        "properties": { // 匹配当前(根)对象的属性          "attributes": { // 检查名为 "attributes" 的属性            "properties": {              "order_type": { "const": "ORDER" } // 进一步检查 "attributes" 内部的 "order_type" 属性,其值必须是 "ORDER"            },            "required": ["order_type"] // 确保 "attributes" 对象中包含 "order_type"          }        },        "required": ["attributes"] // 确保根对象中包含 "attributes" 属性      },

以上就是JSON Schema高级教程:基于嵌套属性的条件必填校验的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
电脑监控专家好用吗?
上一篇 2025年12月1日 18:33:21
史上最强Mate!曝华为Mate 70系列将于11月26日登场
下一篇 2025年12月1日 18:33:25

相关推荐

  • 在无Maven或Eclipse环境下手动构建Java Web应用WAR包的教程

    本教程详细介绍了如何在不依赖Maven或Eclipse等集成开发环境的情况下,为Java Web应用程序手动生成WAR(Web Application Archive)文件。文章首先阐述了WAR文件的基本结构,随后通过一个Ant构建脚本的实例,指导读者完成从源代码编译、文件组织到最终WAR包生成的全…

    2026年9月23日
    000
  • PHP多维数组重构:按指定键值分组数据

    本文将详细介绍如何在PHP中将扁平化的关联数组列表重构为多维数组,核心思路是根据数组中某个特定键(例如 object_type)的值进行分组,将具有相同键值的所有子数组归集到同一个父级键下,从而实现数据的层次化组织,提高数据的可读性和管理效率。 引言:数据重构的需求 在PHP开发中,我们经常会遇到需…

    2026年9月23日
    000
  • Linux安装Redis数据库,无需公网IP实现远程连接

    Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接Linux安装Redis数据库,无需公网IP实现远程连接

    redis作为一种高效的key-value数据库,因其将数据存储在内存中而具备极高的读写速度,广泛应用于多种场景中。以下将详细介绍如何在centos 8的linux虚拟机上搭建redis数据库,并利用cpolar实现内网穿透以便通过公网访问。 在Linux(CentOS 8)上安装Redis数据库 …

    2026年9月23日 • 用户投稿
    000
  • 谷歌为 Gemini CLI 带来扩展功能

    谷歌旗下的 AI 编程助手 Gemini CLI 最近推出了名为“扩展”的全新功能。官方表示,这一更新让用户能够“接入常用工具,并定制属于自己的 AI 命令行体验”。现在,任何开发者都可以发布扩展程序,无需经过谷歌的审核批准即可上线使用。 目前扩展库中已提供超过 50 款扩展,涵盖多种实用场景。例如…

    2026年9月23日
    000
  • 递归方法中静态变量状态管理与重置策略

    本教程探讨了在递归方法中使用静态(全局)变量时,如何正确管理和重置其状态,以避免多次调用时出现累积错误。核心问题在于静态变量在方法调用之间保留其值,导致后续调用基于旧状态进行计算。解决方案是在递归的基准情况(base case)中,在完成当前调用的计算后,立即将静态变量重置为初始值,从而确保每次独立…

    2026年9月23日
    200
  • Win10系统如何删除用户配置文件?

    Win10系统如何删除用户配置文件?Win10系统如何删除用户配置文件?Win10系统如何删除用户配置文件?Win10系统如何删除用户配置文件?

    win10电脑在运行时,许多用户会选择创建个人账户,每个账户都会保存一些配置数据,这类数据可能会占用较多的系统资源。当账户数量增多时,可能会导致系统运行变慢,因此可以考虑移除不常使用的用户配置文件。下面将详细介绍如何在win10中删除用户配置文件。 具体步骤如下: 1、双击桌面上的“此电脑”图标。 …

    2026年9月23日 • 用户投稿
    200
  • VSCode精简配置Perl:语法检查、中文编码、正则调试

    vscode中perl语法检查不生效的主要原因是perl解释器路径未正确配置或缺失,解决方法是在settings.json中明确设置”perl.perlpath”指向正确的perl可执行文件;其次是因缺少cpan模块导致检查失败,需安装对应模块;此外,多个perl扩展冲突、大…

    2026年9月23日
    000
  • PHP多维数组重构:按指定键分组数据

    本文旨在指导读者如何将一个包含多个关联数组的扁平数组,根据其中某个特定键(如object_type)的值,重构为一个多维数组。通过遍历原始数据并动态构建新结构,最终实现数据按指定键值进行高效分组,以便于后续的数据处理和管理。 1. 引言与问题背景 在PHP开发中,我们经常会遇到需要处理和转换数组结构…

    2026年9月23日
    000
  • VS Code团队协作:共享配置与规范

    通过共享VS Code配置实现团队协作标准化,1. 使用.settings.json统一编辑器行为;2. 集成Prettier与ESLint确保代码风格一致;3. 通过extensions.json推荐必备插件;4. 忽略私有配置文件避免冲突,提升开发效率。 在团队开发中,保持代码风格一致和开发环境…

    2026年9月23日
    000
  • Prestashop分类描述在分页时的显示行为解析与SEO考量

    Prestashop商店中,分类描述通常仅在首个分页页面显示,而在后续分页页面上消失,甚至从第二页返回第一页时也可能不显示。这并非一个技术故障,而是Prestashop的默认行为,且从SEO角度看,只要描述在直接访问的第一页可见,就已满足核心要求,无需在所有分页页面重复显示,以避免潜在的重复内容问题…

    2026年9月23日
    100
  • 单个样品测序了近2万个单细胞怎么办

    在单细胞rna测序中,细胞数量过多会导致双细胞比例的增加,但实际情况往往是其他指标表现不佳。例如: Estimated Number of Cells:估计检测到的高质量细胞数Fraction Reads in Cells:高质量细胞的序列数百分比Mean Reads per Cell:每个高质量细…

    2026年9月23日
    000
  • spark运行原理简单介绍和一些总结

    spark运行原理简单介绍和一些总结spark运行原理简单介绍和一些总结spark运行原理简单介绍和一些总结spark运行原理简单介绍和一些总结

    大家好,又见面了,我是你们的朋友全栈君。 一、运行原理 来看一个流程图: 解释如下: 构建spark Application运行环境sparkcontext向资源管理器注册sparkContext向资源管理器申请运行Executor(执行器)资源管理器分配executor资源管理器启动executo…

    2026年9月23日 • 用户投稿
    800
  • Laravel 表单验证失败后自动回填用户输入数据

    本教程详细讲解在 Laravel 应用中,如何优雅地处理表单验证失败场景,确保用户之前输入的数据不会丢失。通过在控制器中使用 withInput() 方法将请求数据闪存到 Session,并在 Blade 模板中使用 old() 辅助函数,实现表单字段的自动回填,显著提升用户体验。 在 Web 应用…

    2026年9月23日
    500
  • VSCode配置C/C++单元测试 完整VSCode开发环境搭建

    要搭建#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8中c/c++单元测试环境,需先安装c/c++扩展、test adapter for google test等必要插件,配置tasks.json和launch.json实现编译与调试…

    2026年9月23日
    000
  • 处理动态数量问答数据的更新教程

    本教程旨在详细阐述如何有效地管理和更新包含动态数量答案的问题数据。我们将探讨在Web表单中如何设计输入字段以捕获答案内容及其唯一标识符,并通过服务器端(以PHP为例)解析提交的数据,从而实现对现有答案的精确更新和新答案的添加,确保数据一致性和系统健壮性。 场景概述:处理动态数量的问答数据更新 在许多…

    2026年9月23日
    100
  • RecyclerView列表滚动到底部检测指南

    本文详细介绍了如何在Android RecyclerView中检测用户何时滚动到列表的最后一个可见项。通过利用RecyclerView.OnScrollListener和LinearLayoutManager提供的方法,我们可以精确判断列表是否已滚动到底部或接近底部,从而触发如加载更多数据或显示提示…

    2026年9月23日
    100
  • 唉,一次堆外内存泄露让整个团队通宵处理到爆肝!

    唉,一次堆外内存泄露让整个团队通宵处理到爆肝!唉,一次堆外内存泄露让整个团队通宵处理到爆肝!唉,一次堆外内存泄露让整个团队通宵处理到爆肝!唉,一次堆外内存泄露让整个团队通宵处理到爆肝!

    点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发… 源码精品专栏 原创 | Java 2021 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中…

    2026年9月23日 • 用户投稿
    500
  • Prestashop分类页描述与分页:SEO考量及前端行为解析

    本文深入探讨Prestashop电商平台中分类页面描述在分页操作时消失的常见现象。我们将解析其背后的技术原理,重点从搜索引擎优化(SEO)角度阐述为何此行为并非核心问题,并强调确保分类描述在首页面加载时的完整性至关重要。同时,文章也提供若需自定义此行为的思路。 Prestashop分类页描述的分页行…

    2026年9月23日
    200
  • VSCode怎样用调试控制台执行临时代码片段 VSCode 调试控制台执行临时代码的创新用法​

    是的,vscode调试控制台可在调试时执行代码片段并查看复杂对象。1. 启动调试会话并打开调试控制台(ctrl+shift+y);2. 直接输入代码访问或修改变量,如myvar=20;3. 执行函数调用或复杂表达式验证逻辑;4. 查看复杂对象时点击展开箭头、使用console.dir()或json.…

    2026年9月23日
    400
  • Java PreparedStatement

    大家好,很高兴再次与大家见面,我是你们的老朋友全栈君。 Java PreparedStatement与Statement类似,是Java JDBC Framework的一部分。它用于对数据库执行CRUD操作。PreparedStatement扩展了Statement接口。由于支持参数化查询,Prep…

    2026年9月23日
    2600

发表回复

登录后才能评论
关注微信