JSON Schema中oneOf互斥校验未按预期生效问题
问题原因
你的Schema没实现预期互斥效果,核心是存在多处关键字用法、字段名、语法错误,根本没触发oneOf的互斥校验逻辑:
oneOf是JSON Schema的组合校验关键字,不能放在properties对象里当属性名,需要和type、properties这类关键字同级,才能对当前节点执行互斥分支校验- 字段名前后完全不统一:需求里明确的字段是
productCodes、productCodesArray,你代码里混写了reasons、reasonsArray、productsIds、productsCodesArray,字段名不匹配自然没法按预期规则校验 - 关键字拼写/位置错误:你把对象用的
additionalProperties错拼成数组专用的additionalItems还放错了层级;minItems是数组级别的校验规则,被你错放到items子节点里,完全不生效 - 没做额外字段限制:就算oneOf位置写对,不配置额外字段禁止规则,对象里同时塞两个互斥字段也会被漏判
正确实现的Schema
{ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://examples.com/schemas/my-array-schema", "type": "object", "required": ["productCodesResult"], "properties": { "productCodesResult": { "type": "object", "oneOf": [ { "$ref": "#/definitions/productCodesDef" }, { "$ref": "#/definitions/productCodesArrayDef" } ], "additionalProperties": false } }, "definitions": { // 分支1:单层产品编码数组 productCodes: [12224, 444444] "productCodesDef": { "type": "object", "required": ["productCodes"], "properties": { "productCodes": { "type": "array", "minItems": 1, "items": { "type": "integer" } } }, "additionalProperties": false }, // 分支2:嵌套产品编码数组集合 productCodesArray: [[12222,55555],[11111,99999]] "productCodesArrayDef": { "type": "object", "required": ["productCodesArray"], "properties": { "productCodesArray": { "type": "array", "minItems": 1, "items": { "type": "array", "minItems": 1, "items": { "type": "integer" } } } }, "additionalProperties": false } } }
校验逻辑说明
productCodesResult节点直接配置oneOf数组,两个分支分别对应两种合法结构,要求传入数据必须恰好匹配其中一个分支的规则- 每个分支定义和外层节点都加了
additionalProperties: false,从根本上禁止同时出现两个互斥字段,不会出现两种结构共存的漏判 - 所有
minItems都放到了对应数组的规则层级,保证编码数组不能为空 - 所有字段名和需求完全对齐,不会出现字段名不匹配的校验失效问题
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

