JSON Schema如何配置互斥属性:必选二选一、可选互斥可都不选
JSON Schema 实现方案
你原有针对A、B属性的oneOf规则逻辑完全正确,只需要把A/B的校验规则、C/D的校验规则通过allOf组合(要求所有规则同时生效),再补充C/D互斥的校验逻辑即可,不需要修改原有代码。
核心规则代码
{ "allOf": [ // 原有A、B二选一且互斥的规则,无需修改 { "oneOf": [ { "required": ["A"] }, { "required": ["B"] } ] }, // 新增C、D互斥(允许均不传入)规则 { "not": { "required": ["C", "D"] } } ], // 按需补充属性定义即可 "properties": { "A": { "type": "string" }, "B": { "type": "string" }, "C": { "type": "string" }, "D": { "type": "string" } } }
规则逻辑说明
allOf的作用是要求数组内的所有校验规则必须全部满足,两个规则独立生效不会冲突- 原有A/B规则保持不变:强制要求A、B必须出现其中一个,且不能同时存在
- C/D规则通过
not + required实现:逻辑为禁止JSON同时包含C和D两个属性,天然覆盖三种合法场景:仅传C、仅传D、C和D都不传,完全符合需求
校验效果验证
- 合法场景全部放行:
{"A":"Prop", "C":"Prop"}:满足A存在、C和D未同时出现,校验通过{"B":"Prop", "D":"Prop"}:满足B存在、C和D未同时出现,校验通过{"B":"Prop"}:满足B存在、C和D都未传入,校验通过
- 非法场景全部拦截:
{"A":"Prop", "B":"Prop"}:违反A/B的oneOf规则,校验失败{"C":"Prop", "D":"Prop"}:违反C/D的not规则,校验失败
如果你使用的JSON Schema版本对
not关键字支持有问题,也可以用冗余版的oneOf写法实现C/D规则,效果完全一致:{ "oneOf": [ { "not": { "anyOf": [{ "required": ["C"] }, { "required": ["D"] }] } }, { "required": ["C"] }, { "required": ["D"] } ] }
内容的提问来源于stack exchange,提问作者noobie
相关产品推荐
相关产品推荐

