JSON Schema Draft-04及后续版本嵌套属性依赖声明方法咨询
JSON Schema Draft-04 中子属性依赖的实现方案
好问题!在JSON Schema Draft-04里,确实没办法直接用dependencies关键字来依赖子属性——因为dependencies的设计只能针对当前对象的直接属性,没法直接引用嵌套的子属性。要实现基于子属性存在的依赖逻辑,你确实得借助allOf结合其他关键字来构建条件,因为Draft-04还没有引入更直观的条件判断语法。
Draft-04 的解决方案
假设你需要实现这样的逻辑:如果parent.child这个子属性存在,那么必须同时存在sibling属性。在Draft-04中,你需要通过allOf+anyOf+not的组合来模拟这个条件:
{ "$schema": "http://json-schema.org/draft-04/schema#", "allOf": [ { "anyOf": [ // 情况1:parent.child 不存在 { "not": { "properties": { "parent": { "required": ["child"] } } } }, // 情况2:sibling 属性存在 { "required": ["sibling"] } ] } ] }
这个schema的逻辑是:实例要么满足parent.child不存在,要么满足sibling存在。这样就间接实现了“当parent.child存在时,sibling必须存在”的依赖关系。
另外要注意,Draft-04的dependencies关键字有两种用法,但都只能作用于直接属性:
- 数组形式:
"dependencies": { "propA": ["propB", "propC"] }—— 当propA存在时,propB和propC必须存在 - Schema形式:
"dependencies": { "propA": { "required": ["propB"] } }—— 当propA存在时,整个实例必须满足指定的schema
但这两种都无法直接关联子属性,所以必须用allOf来组合条件逻辑。
后续版本(Draft-07+)的简化实现
从Draft-07开始,JSON Schema引入了if/then/else关键字,让条件依赖的实现变得非常直观,完全不需要allOf来绕弯子。还是上面的需求,Draft-07+的写法如下:
{ "$schema": "http://json-schema.org/draft-07/schema#", "if": { // 条件:parent.child 存在 "properties": { "parent": { "required": ["child"] } } }, "then": { // 满足条件时的要求:sibling 必须存在 "required": ["sibling"] } }
这种写法逻辑清晰,直接对应你想要的依赖关系,可读性比Draft-04的方案高很多。
内容的提问来源于stack exchange,提问作者neverendingqs
相关产品推荐
相关产品推荐

