能否在JSON Schema的一个对象中用if-else引用另一个对象?
问题解答:你的JSON Schema写法不可行
你尝试的写法无法实现预期逻辑,原因是在obj2的子Schema上下文里,无法直接引用外层的obj1/prop1属性——子Schema的校验范围默认仅限当前层级及以下的属性,跨层级引用必须调整Schema结构。
正确的实现方式(兼容性最好)
把if/then逻辑放在根Schema层级,这样就能访问整个实例对象的属性:
{ "properties": { "obj1": { "type": "object", "properties": { "prop1": {"type": "integer"} } }, "obj2": { "type": "object", "properties": { "prop2": {"type": "integer"} } } }, "if": { "properties": { "obj1": { "properties": { "prop1": {"const": 1} }, "required": ["prop1"] } }, "required": ["obj1"] }, "then": { "properties": { "obj2": { "required": ["prop2"] } } } }
这个Schema的逻辑是:
- 先定义
obj1和obj2的基础结构 - 根层级的
if校验整个实例:确认obj1存在且obj1.prop1等于1 - 满足条件时,
then部分强制要求obj2必须包含prop2
可选:利用$data关键字(兼容性稍差)
如果你的验证器支持JSON Schema Draft 2019-09及以上的$data关键字,也可以在obj2的子Schema里直接引用外层属性:
{ "properties": { "obj1": { "type": "object", "properties": { "prop1": {"type": "integer"} } }, "obj2": { "type": "object", "properties": { "prop2": {"type": "integer"} }, "if": { "$data": "/obj1/prop1", "const": 1 }, "then": { "required": ["prop2"] } } } }
注意:$data并非所有验证器都支持,比如部分旧版工具可能不兼容,优先推荐第一种根层级if/then的写法。
内容的提问来源于stack exchange,提问作者tok
相关产品推荐
相关产品推荐

