JSON Schema数组oneOf引用校验异常:非法项未被拦截
JSON Schema数组元素校验异常排查与修复
问题根源:你大概率是把
anyOf的层级放错了,或者items字段的定义不符合规范。比如错误地将items设为包含channel和router的数组(这是tuple类型的写法,仅校验对应位置的元素),而非单个schema(校验数组所有元素),就会出现混合合法/非法项时校验通过的情况。正确的Schema写法示例:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "items": { "type": "array", "items": { "anyOf": [ {"$ref": "#/$defs/channel"}, {"$ref": "#/$defs/router"} ] } } }, "$defs": { "channel": { "type": "object", "required": ["channelId"], "properties": { "channelId": {"type": "string"} } }, "router": { "type": "object", "required": ["routerId"], "properties": { "routerId": {"type": "string"} } } } }
- 错误写法对比(导致问题的常见情况):
如果你的items写成下面这样,只会校验数组第一个元素符合channel、第二个符合router,后续元素无约束,自然会放过非法项:
"items": [ {"$ref": "#/$defs/channel"}, {"$ref": "#/$defs/router"} ]
- 验证逻辑说明:
当items是单个schema对象时,JSON Schema会要求数组的每一个元素都必须满足该schema的约束(这里就是匹配channel或router任意一个);而如果items是数组形式,则是tuple校验规则,仅对应位置的元素需要匹配对应schema,超出定义长度的元素默认不受约束(除非额外设置additionalItems: false)。
内容的提问来源于stack exchange,提问作者mistercoffee66
相关产品推荐
相关产品推荐

