参考
模式组合
JSON Schema 包含一些用于将模式组合在一起的关键字。请注意,这并不一定意味着要将来自多个文件或 JSON 树的模式组合在一起,尽管这些功能有助于实现这一点,并且在构建复杂模式中进行了描述。组合模式可能像允许一个值同时针对多个标准进行验证一样简单。
这些关键字对应于众所周知的布尔代数概念,如 AND、OR、XOR 和 NOT。你通常可以使用这些关键字来表达无法用标准 JSON Schema 关键字表达的复杂约束。
用于组合模式的关键字是
allOf
: (AND) 必须对所有子模式有效anyOf
: (OR) 必须对任何子模式有效oneOf
: (XOR) 必须对恰好一个子模式有效
所有这些关键字都必须设置为一个数组,其中每个项目都是一个模式。注意递归模式,因为它们会呈指数级地增加处理时间。
此外,还有
not
: (NOT) 必须不对给定的模式有效
allOf
要针对allOf
进行验证,给定的数据必须对所有给定的子模式有效。
模式
{ "allOf": [ { "type": "string" }, { "maxLength": 5 } ]}
数据
"short"
符合模式
数据
"too long"
不符合模式
anyOf
要针对 anyOf
进行验证,给定的数据必须针对给定的子模式中的任何一个(一个或多个)有效。
模式
{ "anyOf": [ { "type": "string", "maxLength": 5 }, { "type": "number", "minimum": 0 } ]}
数据
"short"
符合模式
数据
"too long"
不符合模式
数据
12
符合模式
数据
-5
不符合模式
oneOf
要针对 oneOf
进行验证,给定的数据必须针对给定的子模式中的恰好一个有效。
模式
{ "oneOf": [ { "type": "number", "multipleOf": 5 }, { "type": "number", "multipleOf": 3 } ]}
数据
10
符合模式
数据
9
符合模式
不是 5 或 3 的倍数。
数据
2
不符合模式
同时是 5 和 3 的倍数将被拒绝。
数据
15
不符合模式
在使用
oneOf
条目时应谨慎考虑,因为它的本质要求验证 *每个* 子模式,这会导致处理时间增加。如果可能,优先使用 anyOf
。不
关键字 not
声明,如果实例不通过给定子模式验证,则它有效。
例如,以下模式验证任何不是字符串的内容
模式
{ "not": { "type": "string" } }
数据
42
符合模式
数据
{ "key": "value" }
符合模式
数据
"I am a string"
不符合模式
模式组合的属性
不合逻辑的模式
请注意,使用这些关键字很容易创建逻辑上不可能的模式。以下示例创建了一个模式,该模式不会验证任何内容(因为某样东西不可能同时是字符串和数字)
模式
{ "allOf": [ { "type": "string" }, { "type": "number" } ]}
数据
"No way"
不符合模式
数据
-1
不符合模式
模式分解
请注意,可以将子模式的公共部分“分解”出来。以下两个模式是等效的。
模式
{ "oneOf": [ { "type": "number", "multipleOf": 5 }, { "type": "number", "multipleOf": 3 } ]}
模式
{ "type": "number", "oneOf": [ { "multipleOf": 5 }, { "multipleOf": 3 } ]}