要求不存在值的JSON模式

时间:2019-03-07 21:59:39

标签: json validation jsonschema

我想在我的架构上执行JSON验证,该架构具有四个属性:

  • group
  • partition
  • select
  • features

如果使用grouppartition,则需要features。如果使用select,那么features禁止。 (请注意,这似乎与this question中的情况有所不同-我不想将features设置为“非必需”,但是如果您将其包括在内,则是一个验证错误。 / p>

所以我的三个选择是:

  • groupfeatures
  • partitionfeatures
  • select而非features

我将这些编码为:

"oneOf": [
  { "required": [ "group", "features" ] },
  { "required": [ "partition", "features" ] },
  { "required": [ "select" ] }
]

但是我不知道如何适当地将features排除在最后一个选项之外-甚至还有可能吗?

2 个答案:

答案 0 :(得分:1)

有几种方法可以对此建模。如果您希望自由地允许其他属性,而仅明确排除称为“功能”的属性,则可以使用not关键字:

"oneOf": [
  { "required": [ "group", "features" ] },
  { "required": [ "partition", "features" ] },
  { "required": [ "select" ], "not": { "required": ["features"] } }
]

如果子架构无效,则not关键字的评估结果为“有效”,如果子架构有效,则关键字的评估结果为“无效”。

答案 1 :(得分:0)

您可以定义几个有效的模式

   {
        "item": {
            "anyOf": [
                { "$ref": "#/definitions/group" },
                { "$ref": "#/definitions/partition" },
                { "$ref": "#/definitions/select" },
            ]
        }
    }

对于选择,您可以定义模式,将extraProperties设置为false,就像这样

{
  "type": "object",
  "properties": {
    "select": {"type": "string"}
  },
  "additionalProperties": false
}

然后您会收到如下错误:

  

ValidationError:不允许其他属性