有条件地排除一个同级对象属性,这取决于JSON模式中其他同级对象的属性

时间:2019-09-26 14:06:59

标签: json jsonschema json-schema-validator

我有一个具有两个同级JSON对象的JSON,并且我希望有一个满足以下条件的架构:

我需要一个架构,当第一个对象中没有HARD_RULES或SOFT_RULES枚举时,我需要在第二个对象中使用'referee'属性。

但是,在存在object1的HARD_RULES或SOFT_RULES枚举的情况下,应该忽略或丢弃第二个对象中的“裁判”属性。

请注意:

  1. 当有SOFT / HARD规则时,我同时需要object1和2。
  2. 当对象1完全不可用时,因为没有SOFT / HARD规则,我需要对象2。
  3. 当第一个对象中没有HARD_RULES或SOFT_RULES枚举时,object2中的“裁判”是必需的。
{
    "items": [{//Object 1
        "required": ["host"],
        "properties": {
            "type": {
                "enum": ["HARD_RULES", "SOFT_RULES"],
                "type": "string"
            },
            "host": {
                "type": "string"
            }
        }
    }, {//Object 2
        "required": ["refree"],
        "properties": {
            "type": {
                "enum": ["INDOOR"],
                "type": "string"
            },
            "refree": {
                "type": "string"
            }
        }
    }]
}

一些例子:

//valid 1
{
  "items":[
  {
    "type":"HARD_RULES",
    "host": "some-host",
    "age":10
  },
  {
    "type":"INDOOR",
    "time":"some-time"
    //no referee here
  }
  ]
}

//valid 2
{
  "items":[
  {
    "type":"SOFT_RULES",
    "host": "some-host",
    "age":10
  },
  {
    "type":"INDOOR",
    "time":"some-time"
    //no referee here
  }
  ]
}

//valid 3
{
  "items":[{
    "type":"INDOOR",
    "time":"some-time",
    "refree":"Tom"  // referee here
  }]
}

//invalid
{
  "items":[
  {
    "type":"SOFT_RULES",
    "host": "some-host",
    "age":10
  },
  {
    "type":"INDOOR",
    "time":"some-time",
    "refree":"Tom"  // referee cannot be here as we have SOFT_RULES above
  }
  ]
}

1 个答案:

答案 0 :(得分:0)

假设您在此处使用draf-7。

您需要将两个子方案包装在oneOf数组中。

这意味着其中一个模式必须是有效的,不得超过一个,而不是一个。

您还需要为每个子模式添加additionalProperties: false

您已经快要得到这个了!