Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation jsonSchema属性有条件地需要依赖于父对象_Validation_Conditional_Jsonschema - Fatal编程技术网

Validation jsonSchema属性有条件地需要依赖于父对象

Validation jsonSchema属性有条件地需要依赖于父对象,validation,conditional,jsonschema,Validation,Conditional,Jsonschema,根据这个问题,我可以应用条件必需属性。但是,它只能依赖于同一级别对象上的属性。在某些情况下,我希望一个所需的属性依赖于其父对象属性,是否可能?对于以下示例: { type: 'object', properties: { { os: { type: 'string', enum: ['macOs', 'windows'] }, specs: { macModel: { type: 'string',

根据这个问题,我可以应用条件必需属性。但是,它只能依赖于同一级别对象上的属性。在某些情况下,我希望一个所需的属性依赖于其父对象属性,是否可能?对于以下示例:

{
  type: 'object',
  properties: {
    { 
      os: { type: 'string', enum: ['macOs', 'windows'] },
      specs: {
        macModel: { 
          type: 'string', 
          enum: ['macbook air', 'macbook pro', 'macbook']
        },
        memory: { type: 'number' }
      }
    }
  }
}

是否可能满足此要求:/spec/macModel仅在/os等于macOs时才需要?

是的,同样的方法适用。您只需要将模式嵌套得更深一点

{
  "type": "object",
  "properties": {
    "os": { "enum": ["macOs", "windows"] },
    "specs": {
      "type": "object",
      "properties": {
        "macModel": { "enum": ["macbook air", "macbook pro", "macbook"] },
        "memory": { "type": "number" }
      }
    }
  },
  "allOf": [{ "$ref": "#/definitions/os-macOs-requires-macModel" }],
  "definitions": {
    "os-macOs-requires-macModel": {
      "anyOf": [
        { "not": { "$ref": "#/definitions/os-macOs" } },
        { "$ref": "#/definitions/requires-macModel" }
      ]
    },
    "os-macOs": {
      "properties": {
        "os": { "const": "macOs" }
      },
      "required": ["os"]
    },
    "requires-macModel": {
      "properties": {
        "specs": {
          "required": ["macModel"]
        }
      }
    }
  }
}
请注意,在/definitions/requires macModel模式中,它必须深入specs属性,并将所需的属性放在那里,而不是放在最顶层,因为它是在普通情况下


我在本例中使用了隐含模式,但如果您喜欢该方法并有权访问draft-07验证器,则可以使用if-then-else关键字实现此目的。如果规范不足以让您开始,请让我知道它是有效的,将验证放入allOf是一个很好的模式,谢谢。