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

如何使用JSON Schema 2020-12版本定义仅允许属性A或属性B二选一的Schema规范

实现JSON Schema中属性A和B的互斥需求(2020-12版本)

没问题,JSON Schema 2020-12提供了很直观的方式来实现这种属性互斥的需求。我给你两种方案,分别对应不同的场景:

场景1:允许A、B都不存在,但不能同时存在

这个场景完全匹配你给出的示例——包含foo+A、foo+B都是合法的,仅同时包含A和B是非法的,甚至只包含foo也是合法的。

对应的Schema如下:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "A": { "type": "string" },
    "B": { "type": "string" }
  },
  "allOf": [
    {
      "if": { "required": ["A"] },
      "then": { "not": { "required": ["B"] } }
    },
    {
      "if": { "required": ["B"] },
      "then": { "not": { "required": ["A"] } }
    }
  ]
}

规则解释:

  • $schema:指定使用JSON Schema 2020-12版本,确保关键字行为符合预期。
  • properties:定义所有允许出现在对象中的属性,这里给foo、A、B都设置为字符串类型,你可以根据实际业务需求修改类型(比如number、object等)。
  • allOf下的两个if/then规则:
    • 第一条:如果对象包含A属性,那么它绝对不能包含B属性。
    • 第二条:如果对象包含B属性,那么它绝对不能包含A属性。

场景2:必须包含A或B中的一个(二者选其一)

如果你的需求是对象必须包含A或者B中的一个(不能两者都没有),可以用oneOf来实现:

对应的Schema如下:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "foo": { "type": "string" },
    "A": { "type": "string" },
    "B": { "type": "string" }
  },
  "oneOf": [
    {
      "required": ["A"],
      "not": { "required": ["B"] }
    },
    {
      "required": ["B"],
      "not": { "required": ["A"] }
    }
  ]
}

规则解释:

  • oneOf要求对象必须严格匹配其中一个分支:
    • 分支1:必须包含A,且不能包含B。
    • 分支2:必须包含B,且不能包含A。
  • 这样一来,只包含foo的对象会被判定为非法,同时包含A和B的对象也会被判定为非法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:58:13