参考

模式组合

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"
不符合模式

allOf 不能用于以面向对象继承的方式“扩展”模式以向其添加更多详细信息。 实例 必须独立地对 allOf 中的所有模式有效。有关更多信息,请参阅有关 扩展封闭模式 的部分。

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 } ]}

需要帮助?

您觉得这些文档有用吗?

帮助我们使我们的文档更加完善!

在 JSON Schema 中,我们重视文档贡献,就像其他任何类型的贡献一样!

仍然需要帮助?

学习 JSON Schema 通常令人困惑,但别担心,我们在这里提供帮助!