我想要一种模式来验证有很多重叠的两种不同类型的对象。考虑以下 json 模式:
{
"properties": {
"a":{"const":1}
},
"oneOf": [
{ "properties": { "b":{"const":2}}},
{ "properties": { "c":{"const":3}}}
],
"additionalProperties":false
}
显然,这总是会失败,因为对象必须有“a”并且只有“a”,并且还必须有“b”或“c”,这是一个矛盾。
我当然可以像这样重新排列它:
{
"oneOf": [
{ "properties": { "a":{"const":1}, "b":{"const":2}}, "additionalProperties": false},
{ "properties": { "a":{"const":1}, "c":{"const":3}}, "additionalProperties": false}
]
}
这就是我的预期行为。但我不喜欢它。因为“a”上的规则无法重用。如果我需要重用很多属性怎么办?我喜欢类似于第一个模式的形式,但其功能类似于第二个模式。是否可以重用“a”的规则并获得预期的功能?
您可以采用第一种方法并使用
unevaluatedProperties
而不是 additionalProperties
。
additionalProperties
无法“查看”相邻关键字的子模式,但 unevaluatedProperties
可以并且是专门为此目的添加的。
{
"properties": {
"a":{"const":1}
},
"oneOf": [
{ "properties": { "b":{"const":2}}},
{ "properties": { "c":{"const":3}}}
],
"unevaluatedProperties":false
}
您需要至少使用 2019-09 版草案才能拥有
unevaluatedProperties
关键字。 理想情况下,您无论如何都要指定 $schema
(和 $id
)。
您可以在我的游乐场上测试这个,https://json-everything.net/json-schema。