如何使用JSON Schema 2020-12版本定义仅允许属性A或属性B二选一的Schema规范
实现JSON Schema中属性A和B的互斥需求(2020-12版本)
没问题,JSON Schema 2020-12提供了很直观的方式来实现这种属性互斥的需求。我给你两种方案,分别对应不同的场景:
场景1:允许A、B都不存在,但不能同时存在
这个场景完全匹配你给出的示例——包含foo+A、foo+B都是合法的,仅同时包含A和B是非法的,甚至只包含foo也是合法的。
对应的Schema如下:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "foo": { "type": "string" }, "A": { "type": "string" }, "B": { "type": "string" } }, "allOf": [ { "if": { "required": ["A"] }, "then": { "not": { "required": ["B"] } } }, { "if": { "required": ["B"] }, "then": { "not": { "required": ["A"] } } } ] }
规则解释:
$schema:指定使用JSON Schema 2020-12版本,确保关键字行为符合预期。properties:定义所有允许出现在对象中的属性,这里给foo、A、B都设置为字符串类型,你可以根据实际业务需求修改类型(比如number、object等)。allOf下的两个if/then规则:- 第一条:如果对象包含
A属性,那么它绝对不能包含B属性。 - 第二条:如果对象包含
B属性,那么它绝对不能包含A属性。
- 第一条:如果对象包含
场景2:必须包含A或B中的一个(二者选其一)
如果你的需求是对象必须包含A或者B中的一个(不能两者都没有),可以用oneOf来实现:
对应的Schema如下:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "foo": { "type": "string" }, "A": { "type": "string" }, "B": { "type": "string" } }, "oneOf": [ { "required": ["A"], "not": { "required": ["B"] } }, { "required": ["B"], "not": { "required": ["A"] } } ] }
规则解释:
oneOf要求对象必须严格匹配其中一个分支:- 分支1:必须包含
A,且不能包含B。 - 分支2:必须包含
B,且不能包含A。
- 分支1:必须包含
- 这样一来,只包含
foo的对象会被判定为非法,同时包含A和B的对象也会被判定为非法。
内容的提问来源于stack exchange,提问作者Paul Grinberg
相关产品推荐
相关产品推荐

