如何在JSON Schema中定义两个布尔属性互斥的校验规则
最简洁实现方案
你要实现的规则本质是禁止propOne和propTwo同时为true,直接用not关键字就可以实现,写法兼容性好(支持draft-07及以上版本),代码量最少:
"not": { "properties": { "propOne": { "const": true }, "propTwo": { "const": true } }, "required": ["propOne", "propTwo"] }
如果你的业务要求两个属性必须都存在,直接在schema顶层添加"required": ["propOne", "propTwo"]即可,不会影响上述校验逻辑。
现有写法问题修正
你目前贴的oneOf写法存在逻辑错误,两个分支的校验规则完全一致,根本达不到校验效果。如果一定要用oneOf实现(允许两个属性同时为false的场景),正确写法如下:
"oneOf": [ { "properties": { "propOne": { "const": true }, "propTwo": { "const": false } }, "required": ["propOne", "propTwo"] }, { "properties": { "propOne": { "const": false }, "propTwo": { "const": true } }, "required": ["propOne", "propTwo"] }, { "properties": { "propOne": { "const": false }, "propTwo": { "const": false } }, "required": ["propOne", "propTwo"] } ]
这种写法比not的方案冗长很多,没有特殊需求不推荐使用。
其他实现方案对比
你提到的if/then写法确实代码行数更多,逻辑嵌套也更深,可读性更差,示例如下:
"if": { "properties": { "propOne": { "const": true } }, "required": ["propOne"] }, "then": { "properties": { "propTwo": { "const": false } }, "required": ["propTwo"] }, "else": { "if": { "properties": { "propTwo": { "const": true } }, "required": ["propTwo"] }, "then": { "properties": { "propOne": { "const": false } }, "required": ["propOne"] } }
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

