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

如何实现JSON Schema数组元素的多层级关联条件校验

问题原因分析

你的原始Schema存在两个核心错误:

  • 结构层级写错:paths_1是对象类型,它的直接属性是path_1,path_1才是需要校验的数组,你把数组相关的items规则错写在了paths_1的属性定义中,这部分规则完全不会生效。
  • then分支规则范围错误:你要求path_1下的所有数组元素都必须有def字段,自然会把abc为invalid_abc的对象也纳入校验范围,不符合你的需求。
正确实现方案

以下是符合你需求的JSON Schema(兼容draft-07版本):

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "type": "object",
  "required": ["paths_1", "paths_2"],
  "properties": {
    "paths_1": {
      "type": "object",
      "required": ["path_1"],
      "properties": {
        "path_1": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "abc": {"type": "string"},
              "def": {"type": "string"}
            }
          }
        }
      }
    },
    "paths_2": {
      "type": "object",
      "required": ["path_2"],
      "properties": {
        "path_2": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "ghi": {"type": "string"}
            },
            "required": ["ghi"]
          }
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "allOf": [
          {
            "properties": {
              "paths_1": {
                "properties": {
                  "path_1": {
                    "contains": {
                      "properties": {"abc": {"const": "valid_abc"}},
                      "required": ["abc"]
                    }
                  }
                }
              }
            }
          },
          {
            "properties": {
              "paths_2": {
                "properties": {
                  "path_2": {
                    "contains": {
                      "properties": {"ghi": {"const": "valid_ghi"}},
                      "required": ["ghi"]
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "then": {
        "properties": {
          "paths_1": {
            "properties": {
              "path_1": {
                "items": {
                  "if": {
                    "properties": {"abc": {"const": "valid_abc"}},
                    "required": ["abc"]
                  },
                  "then": {
                    "required": ["def"]
                  }
                }
              }
            }
          }
        }
      }
    }
  ]
}
规则说明

if分支的判断逻辑和你原有逻辑一致,只要同时满足两个条件就触发then规则:

  1. paths_1.path_1数组中存在至少一个abc为valid_abc的对象
  2. paths_2.path_2数组中存在至少一个ghi为valid_ghi的对象

then分支做了逻辑优化,不是强制所有数组元素带def,而是嵌套了一层if-then规则:

  • 仅当数组元素的abc为valid_abc时,才要求该元素必须有def字段
  • abc为其他值的元素不受这个规则限制,不需要携带def
校验效果

用你给出的示例输入测试,会准确报出第一个abc为valid_abc的对象缺少def,第二个abc为invalid_abc的对象不会触发报错,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Emre Sevinç

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:15:02