JSON Schema Draft7:验证指定属性需存在于两个对象之一
解决方案
完全可以实现这个需求,基于JSON Schema Draft7的标准关键字就能搞定。
实现思路
针对/jobs/*/steps/*中包含run属性的元素,我们通过if/then语法锁定目标元素,再用anyOf要求它满足以下两个条件之一:
- 自身存在
foo属性; - 根节点下的
/default/foo属性存在。
完整Schema代码
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "default": { "type": "object", "properties": { "foo": {} } }, "jobs": { "type": "object", "patternProperties": { "^.*$": { "type": "object", "properties": { "steps": { "type": "array", "items": { "type": "object", "properties": { "run": {}, "foo": {} }, // 筛选出包含run属性的步骤元素 "if": { "required": ["run"] }, // 对符合条件的元素施加验证规则 "then": { "anyOf": [ // 条件1:当前步骤自身存在foo属性 { "required": ["foo"] }, // 条件2:根节点的default下存在foo属性 { "$ref": "#", "required": ["default"], "properties": { "default": { "required": ["foo"] } } } ] } } } } } } } } }
规则验证场景
- 仅删除
/default/foo:只要含run的步骤自身有foo,验证通过; - 仅删除步骤的
foo:只要/default/foo存在,验证通过; - 两者都删除:含
run的步骤会触发验证失败。
内容的提问来源于stack exchange,提问作者womble
相关产品推荐
相关产品推荐

