JSON Schema如何校验choices数组中isCorrect字段仅存在一个true值
实现方案
可以实现该校验规则,针对你当前使用的JSON Schema 2020-12草案,使用contains+minContains+maxContains的组合即可完成需求。
规则逻辑说明
contains关键字:指定数组中需要匹配的项规则,这里要求匹配isCorrect值为true的对象minContains: 1:要求数组中至少有1个匹配contains规则的项maxContains: 1:要求数组中最多有1个匹配contains规则的项
三者组合就刚好实现「有且仅有一个isCorrect为true」的校验要求。
修改后的完整Schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "required": ["choices"], "properties": { "choices": { "type": "array", "items": { "type": "object", "properties": { "value": { "type": "string" }, "isCorrect": { "type": "boolean" } }, "required": ["value", "isCorrect"], "additionalProperties": false }, "minItems": 1, "maxItems": 50, "uniqueItems": true, "additionalItems": false, "contains": { "properties": { "isCorrect": { "const": true } }, "required": ["isCorrect"] }, "minContains": 1, "maxContains": 1 } } }
兼容旧草案的实现方案(可选)
如果你需要兼容draft-07及更早不支持minContains/maxContains的草案版本,可以用逻辑组合实现相同效果:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "required": ["choices"], "properties": { "choices": { "type": "array", "items": { "type": "object", "properties": { "value": { "type": "string" }, "isCorrect": { "type": "boolean" } }, "required": ["value", "isCorrect"], "additionalProperties": false }, "minItems": 1, "maxItems": 50, "uniqueItems": true, "additionalItems": false, "allOf": [ {"contains": {"properties": {"isCorrect": {"const": true}}}}, { "not": { "items": { "contains": {"properties": {"isCorrect": {"const": true}}}, "minItems": 2 } } } ] } } }
校验效果
- 当
choices数组中没有isCorrect: true的项:校验不通过 - 当
choices数组中有2个及以上isCorrect: true的项:校验不通过 - 当
choices数组中恰好有1个isCorrect: true的项:校验通过
内容的提问来源于stack exchange,提问作者Anuj TBE
相关产品推荐
相关产品推荐

