我想在我的架构上执行JSON验证,该架构具有四个属性:
group
partition
select
features
如果使用group
或partition
,则需要features
。如果使用select
,那么features
被禁止。 (请注意,这似乎与this question中的情况有所不同-我不想将features
设置为“非必需”,但是如果您将其包括在内,则是一个验证错误。 / p>
所以我的三个选择是:
group
和features
partition
和features
select
而非features
我将这些编码为:
"oneOf": [
{ "required": [ "group", "features" ] },
{ "required": [ "partition", "features" ] },
{ "required": [ "select" ] }
]
但是我不知道如何适当地将features
排除在最后一个选项之外-甚至还有可能吗?
答案 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:不允许其他属性