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

如何使用JSON Schema的anyOf与not筛选对象元素组合并排除指定元素

JSON Schema元素组合筛选解决方案

原始Schema修正说明

首先修正你提供的原始Schema中的语法问题:$defs里的对象定义需要将属性放在properties字段下,并添加required确保必填属性存在:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "$id": "https://example.com/schemas/long-schema",
  "type": "object",
  "properties": {
    "propA": { "$ref": "#/$defs/objectA" },
    "propB": { "$ref": "#/$defs/objectB" },
    "propC": { "$ref": "#/$defs/objectC" }
  },
  "$defs": {
    "objectA": {
      "type": "object",
      "properties": { "a": { "type": "string", "enum": ["A"] } },
      "required": ["a"]
    },
    "objectB": {
      "type": "object",
      "properties": { "b": { "type": "string", "enum": ["B"] } },
      "required": ["b"]
    },
    "objectC": {
      "type": "object",
      "properties": { "c": { "type": "string", "enum": ["C"] } },
      "required": ["c"]
    }
  }
}

需求1:允许B、C的任意组合(单个B/单个C/B+C),禁止A

你的原写法错误在于:not直接引用objectA是验证值不符合objectA的定义,但我们需要禁止propA属性存在;同时需要确保至少包含B或C中的一个(避免空对象)。正确写法使用allOf组合两个约束:

{
  // 保留上述修正后的schema结构...
  "allOf": [
    { "not": { "required": ["propA"] } }, // 禁止出现propA属性
    { "anyOf": [
      { "required": ["propB"] },
      { "required": ["propC"] }
    ] } // 至少包含B或C中的一个
  ],
  "$comment": "Choose objects B, C or B & C, but not A"
}

需求2:允许A、B的任意组合(单个A/单个B/A+B),禁止C

同理,通过allOf组合“禁止propC”和“至少包含A或B”两个约束:

{
  // 保留上述修正后的schema结构...
  "allOf": [
    { "not": { "required": ["propC"] } }, // 禁止出现propC属性
    { "anyOf": [
      { "required": ["propA"] },
      { "required": ["propB"] }
    ] } // 至少包含A或B中的一个
  ],
  "$comment": "A and B but not C, allowing any combination of A and B"
}

关键语法说明

  • not: { "required": ["propX"] }:用于禁止对象包含propX属性,这是实现“排除某个元素”的核心。
  • allOf:用于同时满足多个约束条件(比如“禁止某属性”+“至少有一个允许的属性”)。
  • anyOf:用于满足多个条件中的任意一个(比如“有B”或“有C”)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:18:28