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

如何编写满足默认Color与数组项校验规则的JSON Schema?

解决JSON Schema的条件校验问题

我明白你遇到的困扰了——你需要实现「要么有全局默认Color字段,要么列表中所有项都必须指定Color」的校验规则,之前用anyOf的写法没达到预期,核心问题是第二个分支没有明确排除全局Color的存在,同时对List项的约束逻辑没有正确生效。

问题分析

你原来的anyOf第二个分支仅定义了List的items需要Color,但没有限制全局Color不能存在;再加上顶层properties中已经定义了List的基础结构,分支里的List规则没能正确覆盖校验逻辑。我们需要调整anyOf的两个分支,让它们互斥且覆盖所有合法场景:

  • 场景1:存在全局Color字段(此时List项可自由选择是否包含Color)
  • 场景2:不存在全局Color字段,且List数组中每一项都必须包含Color字段

修正后的JSON Schema

{
  "type": "object",
  "properties": {
    "List": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/Item"
      }
    },
    "Color": {
      "type": "string"
    }
  },
  "definitions": {
    "Item": {
      "type": "object",
      "properties": {
        "Color": {
          "type": "string"
        }
      }
    }
  },
  "anyOf": [
    {
      "required": ["Color"]
    },
    {
      "not": {
        "required": ["Color"]
      },
      "properties": {
        "List": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Item",
            "required": ["Color"]
          }
        }
      },
      "required": ["List"]
    }
  ]
}

关键调整说明

  1. 场景1(存在全局Color):和你原来的写法一致,用required: ["Color"]确保全局有Color字段,此时List项无论是否包含Color都能通过校验。
  2. 场景2(无全局Color且所有List项有Color):
    • 用not: { "required": ["Color"] }明确限制全局Color不能存在
    • 对List的items添加required: ["Color"],强制每一项都必须包含Color字段
    • 添加required: ["List"],避免「无全局Color且无List」的非法场景通过校验(如果你的业务允许List不存在,可移除这一行)

测试用例验证

  • 合法示例1(有全局Color):{"List": [{"Color": "red"}, {}], "Color": "grey"} → 通过
  • 合法示例2(无全局Color,所有List项有Color):{"List": [{"Color": "red"}, {"Color": "blue"}]} → 通过
  • 非法示例(无全局Color,存在List项无Color):{"List": [{"Color": "red"}, {}]} → 不通过
  • 非法示例(无全局Color且无List):{} → 不通过(移除required: ["List"]则会通过)

这样调整后,校验器就能正确识别两个分支的规则,完美匹配你的业务需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:28:12