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

如何在JSON Schema中限制数组内每种枚举类型元素至多一个

解决方案:限制salad数组中每种fruitType至多出现一次

这个需求在JSON Schema Draft-07中是可以实现的,下面提供两种可行方案:

方案一:基于枚举值逐个限制(标准Draft-07兼容)

由于fruitType是明确的枚举值,我们可以针对每个枚举值,限制数组中包含该值的元素至多出现一次。修改后的salad Schema如下:

{
  "$schema": "https://json-schema.org/draft-07/schema",
  "type": "object",
  "title": "salad",
  "properties": {
    "fruits": {
      "type": "array",
      "items": {
        "$ref": "classpath:schema/fruit.json"
      },
      "allOf": [
        {
          "maxContains": 1,
          "contains": {
            "properties": { "fruitType": { "const": "bitter" } },
            "required": ["fruitType"]
          }
        },
        {
          "maxContains": 1,
          "contains": {
            "properties": { "fruitType": { "const": "tangy" } },
            "required": ["fruitType"]
          }
        },
        {
          "maxContains": 1,
          "contains": {
            "properties": { "fruitType": { "const": "sweet" } },
            "required": ["fruitType"]
          }
        },
        {
          "maxContains": 1,
          "contains": {
            "properties": { "fruitType": { "const": "sour" } },
            "required": ["fruitType"]
          }
        }
      ]
    }
  }
}

原理说明

  • contains用于匹配数组中至少一个符合条件的元素
  • maxContains: 1限制符合条件的元素数量不超过1
  • 每个allOf子项对应一个fruitType枚举值,确保每种类型最多出现一次

方案二:使用$data关键字(需实现支持)

如果你的JSON Schema验证器支持$data关键字(比如AJV),可以更灵活地实现该需求,无需逐个枚举fruitType值:

{
  "$schema": "https://json-schema.org/draft-07/schema",
  "type": "object",
  "title": "salad",
  "properties": {
    "fruits": {
      "type": "array",
      "items": {
        "$ref": "classpath:schema/fruit.json",
        "not": {
          "contains": {
            "properties": {
              "fruitType": { "$data": "0/fruitType" }
            },
            "required": ["fruitType"]
          }
        }
      }
    }
  }
}

原理说明

  • $data: "0/fruitType"引用当前元素的fruitType值
  • not + contains确保数组中不存在其他元素和当前元素的fruitType值相同
  • 此方案更适合fruitType枚举值可能变动的场景,但依赖验证器对$data的支持

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:43:17