如何实现JSON Schema数组元素的多层级关联条件校验
问题原因分析
你的原始Schema存在两个核心错误:
- 结构层级写错:
paths_1是对象类型,它的直接属性是path_1,path_1才是需要校验的数组,你把数组相关的items规则错写在了paths_1的属性定义中,这部分规则完全不会生效。 then分支规则范围错误:你要求path_1下的所有数组元素都必须有def字段,自然会把abc为invalid_abc的对象也纳入校验范围,不符合你的需求。
正确实现方案
以下是符合你需求的JSON Schema(兼容draft-07版本):
{ "$schema": "http://json-schema.org/draft-07/schema", "type": "object", "required": ["paths_1", "paths_2"], "properties": { "paths_1": { "type": "object", "required": ["path_1"], "properties": { "path_1": { "type": "array", "items": { "type": "object", "properties": { "abc": {"type": "string"}, "def": {"type": "string"} } } } } }, "paths_2": { "type": "object", "required": ["path_2"], "properties": { "path_2": { "type": "array", "items": { "type": "object", "properties": { "ghi": {"type": "string"} }, "required": ["ghi"] } } } } }, "allOf": [ { "if": { "allOf": [ { "properties": { "paths_1": { "properties": { "path_1": { "contains": { "properties": {"abc": {"const": "valid_abc"}}, "required": ["abc"] } } } } } }, { "properties": { "paths_2": { "properties": { "path_2": { "contains": { "properties": {"ghi": {"const": "valid_ghi"}}, "required": ["ghi"] } } } } } } ] }, "then": { "properties": { "paths_1": { "properties": { "path_1": { "items": { "if": { "properties": {"abc": {"const": "valid_abc"}}, "required": ["abc"] }, "then": { "required": ["def"] } } } } } } } } ] }
规则说明
if分支的判断逻辑和你原有逻辑一致,只要同时满足两个条件就触发then规则:
paths_1.path_1数组中存在至少一个abc为valid_abc的对象paths_2.path_2数组中存在至少一个ghi为valid_ghi的对象
then分支做了逻辑优化,不是强制所有数组元素带def,而是嵌套了一层if-then规则:
- 仅当数组元素的
abc为valid_abc时,才要求该元素必须有def字段 abc为其他值的元素不受这个规则限制,不需要携带def
校验效果
用你给出的示例输入测试,会准确报出第一个abc为valid_abc的对象缺少def,第二个abc为invalid_abc的对象不会触发报错,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Emre Sevinç
相关产品推荐
相关产品推荐

