JSONSchema - 依赖于父属性的必需属性

Mik*_*ler 5 javascript jsonschema ajv

我想根据根模式中属性的存在,在数组子模式中应用一个额外的“必需”属性。我的架构设置如下:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "required":[
       "isParentDependency",
       "subArray"
    ],
    "properties": {
        "isParentDependency": {
            "$id": "#/properties/isParentDependency",
            "type": "boolean"
        },
        "subArray": {
            "$id": "#/properties/subArray",
            "type": "array",
            "items": {
                "$id": "#/properties/subArrayItem",
                "required": ["alwaysRequiredProp"],
                "dependencies": {
                    "isParentDependency":{
                        "required":["requiredPropIfIsParentDependency"]
                    }
                },
                "properties": {
                    "alwaysRequiredProp": {
                        "$id": "#/properties/subArray/items/properties/alwaysRequiredProp",
                        "type": "boolean"
                    },
                    "requiredPropIfIsParentDependency": {
                        "$id": "#/properties/subArray/items/properties/requiredPropIfIsParentDependency",
                        "type": "boolean"
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

过往案例

{
    "isParentDependency": false,
    "subArray": [{
        "alwaysRequiredProp": true
    }]
}
Run Code Online (Sandbox Code Playgroud)
    "isParentDependency": true,
    "subArray": [{
        "alwaysRequiredProp": true,
        "requiredPropIfIsParentDependency":true
    }]
}
Run Code Online (Sandbox Code Playgroud)

失败案例

{
    "isParentDependency": true,
    "subArray": [{
        "alwaysRequiredProp": true
    }]
}
Run Code Online (Sandbox Code Playgroud)

显然这行不通,但我一直无法弄清楚如何指向根模式(或应用带有 $ref 的 if/else 类型解决方案)

非常感谢任何指导!

Rel*_*ual 7

使用 JSON Schema,properties在树下嵌套的每一层都看不到树上。因此,您必须在需要查看的最高级别定义您的条件。在这种情况下,这是根级别。

看看这个架构。

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "definitions": {
    "subArray": {
      "type": "array",
      "items": {
        "required": [
          "alwaysRequiredProp"
        ],
        "properties": {
          "alwaysRequiredProp": {
            "type": "boolean"
          },
          "requiredPropIfIsParentDependency": {
            "type": "boolean"
          }
        }
      }
    }
  },
  "required": [
    "isParentDependency",
    "subArray"
  ],
  "properties": {
    "isParentDependency": {
      "type": "boolean"
    },
    "subArray": {
      "$ref": "#/definitions/subArray"
    }
  },
  "if": {
    "properties": {
      "isParentDependency": {
        "const": true
      }
    }
  },
  "then": {
    "properties": {
      "subArray": {
        "items": {
          "required": [
            "requiredPropIfIsParentDependency"
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

subArray 已移至定义然后引用,因此可以更容易地看到条件应用程序逻辑。

的定义subArray仅确定项目结构的属性(如果提供),并且需要alwaysRequiredProp. 它不需要requiredPropIfIsParentDependency.

条件应用程序使用ifthen关键字。

如果if架构为真,则else应用架构。

的值if是一个模式。它适用于根级别。它需要isParentDependencytrue(它不需要属性本身,因为它总是必需的。在 if 语句中需要属性并不意味着总是需要属性,除非elsewas false,但我们甚至没有else在这里使用)。

isParentDependency是 时truethen应用模式,它向下查找树到subArray的项目,需要requiredPropIfIsParentDependency.

您可以使用jsonschema.dev(预加载此架构和您的失败​​实例)在浏览器中测试此工作。