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
相关产品推荐
相关产品推荐

