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

