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

JSON Schema Draft-04及后续版本嵌套属性依赖声明方法咨询

JSON Schema Draft-04 中子属性依赖的实现方案

好问题!在JSON Schema Draft-04里,确实没办法直接用dependencies关键字来依赖子属性——因为dependencies的设计只能针对当前对象的直接属性,没法直接引用嵌套的子属性。要实现基于子属性存在的依赖逻辑,你确实得借助allOf结合其他关键字来构建条件,因为Draft-04还没有引入更直观的条件判断语法。

Draft-04 的解决方案

假设你需要实现这样的逻辑:如果parent.child这个子属性存在,那么必须同时存在sibling属性。在Draft-04中,你需要通过allOf+anyOf+not的组合来模拟这个条件:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "allOf": [
    {
      "anyOf": [
        // 情况1:parent.child 不存在
        {
          "not": {
            "properties": {
              "parent": {
                "required": ["child"]
              }
            }
          }
        },
        // 情况2:sibling 属性存在
        {
          "required": ["sibling"]
        }
      ]
    }
  ]
}

这个schema的逻辑是:实例要么满足parent.child不存在,要么满足sibling存在。这样就间接实现了“当parent.child存在时,sibling必须存在”的依赖关系。

另外要注意,Draft-04的dependencies关键字有两种用法,但都只能作用于直接属性:

  • 数组形式:"dependencies": { "propA": ["propB", "propC"] } —— 当propA存在时,propB和propC必须存在
  • Schema形式:"dependencies": { "propA": { "required": ["propB"] } } —— 当propA存在时,整个实例必须满足指定的schema

但这两种都无法直接关联子属性,所以必须用allOf来组合条件逻辑。

后续版本(Draft-07+)的简化实现

从Draft-07开始,JSON Schema引入了if/then/else关键字,让条件依赖的实现变得非常直观,完全不需要allOf来绕弯子。还是上面的需求,Draft-07+的写法如下:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "if": {
    // 条件:parent.child 存在
    "properties": {
      "parent": {
        "required": ["child"]
      }
    }
  },
  "then": {
    // 满足条件时的要求:sibling 必须存在
    "required": ["sibling"]
  }
}

这种写法逻辑清晰,直接对应你想要的依赖关系,可读性比Draft-04的方案高很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:06:23