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

JSON Schema中maxContains限制失效,如何校验数组仅含一个正确答案

问题分析与解决方案

你遇到的核心问题是**maxContains关键字在JSON Schema Draft 07中尚未被支持**——这个特性是在Draft 2019-09版本才正式引入的。所以当你使用Draft 07的Schema时,maxContains会被校验引擎直接忽略,导致即使存在多个isCorrect: true的元素,校验依然通过。

下面提供两种可行的解决办法:


办法一:升级到支持maxContains的Schema版本

如果你可以切换到更高版本的JSON Schema(推荐Draft 2019-09或后续版本),只需要修改Schema的$schema字段,同时可以优化一些细节让逻辑更严谨:

{
  "$schema": "https://json-schema.org/draft/2019-09/schema#",
  "$id": "http://eg.com/schema2.json",
  "type": "object",
  "title": "Example",
  "required": ["answers"],
  "properties": {
    "answers": {
      "type": "array",
      // 确保至少有一个正确选项(可选,根据你的需求决定)
      "minContains": 1,
      // 限制最多有一个正确选项
      "maxContains": 1,
      "contains": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "text": { "type": "string" },
          // 用const比enum更简洁,效果完全一致
          "isCorrect": { "type": "boolean", "const": true }
        },
        // 强制要求元素必须包含isCorrect字段
        "required": ["isCorrect"]
      },
      "items": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "text": { "type": "string" },
          "isCorrect": { "type": "boolean" }
        },
        // 确保每个选项的必填字段都存在
        "required": ["id", "text", "isCorrect"]
      }
    }
  }
}

办法二:在Draft 07中使用替代方案

如果无法升级Schema版本,我们可以通过allOf+not+嵌套contains的组合逻辑,实现“最多一个正确选项”的校验:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://eg.com/schema2.json",
  "type": "object",
  "title": "Example",
  "required": ["answers"],
  "properties": {
    "answers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "text": { "type": "string" },
          "isCorrect": { "type": "boolean" }
        },
        "required": ["id", "text", "isCorrect"]
      },
      "allOf": [
        // 规则1:至少有一个正确选项
        {
          "contains": {
            "properties": {
              "isCorrect": { "const": true }
            }
          }
        },
        // 规则2:不能存在两个或以上的正确选项
        {
          "not": {
            "contains": {
              "properties": {
                "isCorrect": { "const": true }
              },
              // 嵌套contains表示:在找到第一个正确选项后,剩余数组里还能找到第二个
              "contains": {
                "properties": {
                  "isCorrect": { "const": true }
                }
              }
            }
          }
        }
      ]
    }
  }
}

这个方案的逻辑是:用allOf同时满足两个条件——必须有一个正确选项,且绝对不能出现两个及以上的正确选项。


内容的提问来源于stack exchange,提问作者Avani Agrawal Nath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:47:50