我想基于根模式中属性的存在,在数组子模式中应用附加的“必需”属性。我有这样的模式设置:

{
    "$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"
                    }
                }
            }
        }
    }
}


传递案例

{
    "isParentDependency": false,
    "subArray": [{
        "alwaysRequiredProp": true
    }]
}


    "isParentDependency": true,
    "subArray": [{
        "alwaysRequiredProp": true,
        "requiredPropIfIsParentDependency":true
    }]
}


失败案例

{
    "isParentDependency": true,
    "subArray": [{
        "alwaysRequiredProp": true
    }]
}


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

任何指导,不胜感激!

最佳答案

使用JSON模式,树下嵌套的每个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"
          ]
        }
      }
    }
  }
}


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

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

有条件的应用程序使用ifthen关键字进入。

如果if模式为true,则将应用else模式。

if的值是一个架构。适用于根级别。它要求isParentDependencytrue(它本身不需要属性,因为它总是必需的。在if语句中要求该属性并不意味着始终需要该属性,除非elsefalse,但是我们甚至不在这里使用else)。

isParentDependencytrue时,将应用then模式,该模式将树向下看到subArray的项目,需要requiredPropIfIsParentDependency

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

09-10 11:44
查看更多