JSON Schema如何实现D存在时必须包含A/B/C之一的校验
JSON Schema 第4条规则配置方案
问题根因
现有Schema只实现了「A/B/C存在则必须带D」的正向依赖,缺少「D存在则必须带A/B/C至少一个」的反向依赖约束,同时原有规则3的oneOf写法存在逻辑错误:oneOf要求有且仅有一个条件满足,会导致D、F同时存在时被误判失败,和「D、F至少出现一个」的需求不符。
具体修改方法
在原有Schema的内层对象配置中,做两处调整即可:
- 将规则3原来的
oneOf替换为anyOf,匹配「至少存在一个」的逻辑 - 新增
if/then条件校验块,实现第4条规则:当D属性存在时,要求A/B/C三个属性至少存在一个
修改后的完整Schema代码如下:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "patternProperties": { "^.*": { "type": "object", "properties": { "A": { "type": [ "string", "null" ] }, "B": { "type": [ "string", "null" ] }, "C": { "type": [ "string", "null" ] }, "D": { "type": [ "string", "null" ] }, "E": { "type": [ "string", "null" ] }, "F": { "type": [ "string", "null" ] } }, "dependentRequired": { "E": [ "F" ], "F": [ "E" ], "A": [ "D" ], "B": [ "D" ], "C": [ "D" ] }, // 修正规则3:D、F至少存在一个,允许同时存在 "anyOf": [ { "required": [ "D" ] }, { "required": [ "F" ] } ], // 新增规则4:D存在时A/B/C至少存在一个 "if": { "required": ["D"] }, "then": { "anyOf": [ { "required": ["A"] }, { "required": ["B"] }, { "required": ["C"] } ] } } } }
校验效果验证
修改后所有规则均符合预期:
- 仅提交属性D时:触发if条件,then要求A/B/C至少存在一个,校验不通过,解决当前遇到的核心问题
- 提交D+A/D+B/D+C/任意A/B/C组合+D时:校验通过,不会限制A/B/C同时出现的场景,满足「仅存在三者之一的限制下游处理」的要求
- E、F只传其一时:
dependentRequired触发校验失败,符合规则1 - 只传A/B/C任意一个、不传D时:
dependentRequired触发校验失败,符合规则2 - D、F都不传时:
anyOf块触发校验失败,符合规则3 - D、F同时存在时:校验通过,符合「至少一个」的规则要求
注:原有代码中
patternProperties的正则^*写法不规范,已修正为标准的^.*匹配任意属性名,避免不同JSON Schema校验引擎的兼容性问题。
内容的提问来源于stack exchange,提问作者Mike Silverman
相关产品推荐
相关产品推荐

