我正在使用ajv节点包来验证我的模式。假设一个字段保存一个对象类型。该对象可以具有3个属性:"A", "B", and "C" .如何指定至少必须定义其中一个属性,而不允许定义其他属性?
ajv
"A", "B", and "C"
bq3bfh9z1#
根据您是要禁止 * 所有 * 其他属性还是只禁止特定的其他属性(如果存在“A”,则禁止“B”和“C”,但“foo”仍然可以),您可以将oneOf与additionalProperties: false属性一起使用,也可以使用not来禁止特定属性。施梅玛:
oneOf
additionalProperties: false
not
{ "anyOf": [ { "properties": {"A": {}}, "required": ["A"], "additionalProperties": false }, { "properties": { "B": {}, "A": { "not": {} }, "C": { "not": {} } }, "required": ["B"], } ] }
注意:模式"not": {}始终为false,因此对应属性的值永远无法满足它。此示例使用additionalProperties: false表示“A”,因此它匹配
"not": {}
false
{ "A": 3 }
但两者都不是
{ "A": 3, "B": 5 }
或
{ "A": 3, "foo": 5 }
另一方面,该示例对“B”使用not,因此它匹配
{ "B": 3 }
和
{ "B": 3, "foo": 5 }
但不
{ "A": 3, "C": 5 }
8yoxcaq72#
您可以使用anyOf作为此约束条件。anyOf关键字允许您使用布尔OR运算合并约束条件。
anyOf
{ "anyOf": [ { "required": ["A"] }, { "required": ["B"] }, { "required": ["C"] } ] }
2条答案
按热度按时间bq3bfh9z1#
根据您是要禁止 * 所有 * 其他属性还是只禁止特定的其他属性(如果存在“A”,则禁止“B”和“C”,但“foo”仍然可以),您可以将
oneOf
与additionalProperties: false
属性一起使用,也可以使用not
来禁止特定属性。施梅玛:
注意:模式
"not": {}
始终为false
,因此对应属性的值永远无法满足它。此示例使用
additionalProperties: false
表示“A”,因此它匹配但两者都不是
或
另一方面,该示例对“B”使用
not
,因此它匹配和
但不
8yoxcaq72#
您可以使用
anyOf
作为此约束条件。anyOf
关键字允许您使用布尔OR运算合并约束条件。