You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:30:47