You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON Schema如何实现D存在时必须包含A/B/C之一的校验

JSON Schema 第4条规则配置方案

问题根因

现有Schema只实现了「A/B/C存在则必须带D」的正向依赖,缺少「D存在则必须带A/B/C至少一个」的反向依赖约束,同时原有规则3的oneOf写法存在逻辑错误:oneOf要求有且仅有一个条件满足,会导致D、F同时存在时被误判失败,和「D、F至少出现一个」的需求不符。

具体修改方法

在原有Schema的内层对象配置中,做两处调整即可:

  1. 将规则3原来的oneOf替换为anyOf,匹配「至少存在一个」的逻辑
  2. 新增if/then条件校验块,实现第4条规则:当D属性存在时,要求A/B/C三个属性至少存在一个

修改后的完整Schema代码如下:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "patternProperties": {
    "^.*": {
      "type": "object",
      "properties": {
        "A": {
          "type": [ "string", "null" ]
        },
        "B": {
          "type": [ "string", "null" ]
        },
        "C": {
          "type": [ "string", "null" ]
        },
        "D": {
          "type": [ "string", "null" ]
        },
        "E": {
          "type": [ "string", "null" ]
        },
        "F": {
          "type": [ "string", "null" ]
        }
      },
      "dependentRequired": {
        "E": [ "F" ],
        "F": [ "E" ],
        "A": [ "D" ],
        "B": [ "D" ],
        "C": [ "D" ]
      },
      // 修正规则3:D、F至少存在一个,允许同时存在
      "anyOf": [
          { "required": [ "D" ] },
          { "required": [ "F" ] }
      ],
      // 新增规则4:D存在时A/B/C至少存在一个
      "if": { "required": ["D"] },
      "then": {
        "anyOf": [
          { "required": ["A"] },
          { "required": ["B"] },
          { "required": ["C"] }
        ]
      }
    }
  }
}

校验效果验证

修改后所有规则均符合预期:

  • 仅提交属性D时:触发if条件,then要求A/B/C至少存在一个,校验不通过,解决当前遇到的核心问题
  • 提交D+A/D+B/D+C/任意A/B/C组合+D时:校验通过,不会限制A/B/C同时出现的场景,满足「仅存在三者之一的限制下游处理」的要求
  • E、F只传其一时:dependentRequired触发校验失败,符合规则1
  • 只传A/B/C任意一个、不传D时:dependentRequired触发校验失败,符合规则2
  • D、F都不传时:anyOf块触发校验失败,符合规则3
  • D、F同时存在时:校验通过,符合「至少一个」的规则要求

注:原有代码中patternProperties的正则^*写法不规范,已修正为标准的^.*匹配任意属性名,避免不同JSON Schema校验引擎的兼容性问题。

内容的提问来源于stack exchange,提问作者Mike Silverman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:03:19