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

如何在JSON Schema中定义两个布尔属性互斥的校验规则

最简洁实现方案

你要实现的规则本质是禁止propOne和propTwo同时为true,直接用not关键字就可以实现,写法兼容性好(支持draft-07及以上版本),代码量最少:

"not": {
  "properties": {
    "propOne": { "const": true },
    "propTwo": { "const": true }
  },
  "required": ["propOne", "propTwo"]
}

如果你的业务要求两个属性必须都存在,直接在schema顶层添加"required": ["propOne", "propTwo"]即可,不会影响上述校验逻辑。


现有写法问题修正

你目前贴的oneOf写法存在逻辑错误,两个分支的校验规则完全一致,根本达不到校验效果。如果一定要用oneOf实现(允许两个属性同时为false的场景),正确写法如下:

"oneOf": [
  {
    "properties": {
      "propOne": { "const": true },
      "propTwo": { "const": false }
    },
    "required": ["propOne", "propTwo"]
  },
  {
    "properties": {
      "propOne": { "const": false },
      "propTwo": { "const": true }
    },
    "required": ["propOne", "propTwo"]
  },
  {
    "properties": {
      "propOne": { "const": false },
      "propTwo": { "const": false }
    },
    "required": ["propOne", "propTwo"]
  }
]

这种写法比not的方案冗长很多,没有特殊需求不推荐使用。


其他实现方案对比

你提到的if/then写法确实代码行数更多,逻辑嵌套也更深,可读性更差,示例如下:

"if": {
  "properties": { "propOne": { "const": true } },
  "required": ["propOne"]
},
"then": {
  "properties": { "propTwo": { "const": false } },
  "required": ["propTwo"]
},
"else": {
  "if": {
    "properties": { "propTwo": { "const": true } },
    "required": ["propTwo"]
  },
  "then": {
    "properties": { "propOne": { "const": false } },
    "required": ["propOne"]
  }
}

内容的提问来源于stack exchange,提问作者red888

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:36:04