JSON Schema未按预期校验失效,求基于key约束data的优化方案
优化JSON Schema实现动态校验组件data属性
问题根源
原Schema校验失效的核心原因:
- 校验路径错误:规则要求
prop1/prop2在组件根节点,但待校验JSON中这些属性实际在data子对象内,导致规则从未命中。 - 未限制非法属性:没有禁止不符合当前key的属性存在,也未确保组件仅匹配一种规则,错误的属性组合无法被检测。
优化后的Schema
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "components": { "type": "array", "minItems": 1, "items": { "type": "object", "required": ["key", "data"], "properties": { "key": { "type": "string" }, "data": { "type": "object" } }, "oneOf": [ { "if": { "properties": { "key": { "const": "x" } }, "required": ["key"] }, "then": { "properties": { "data": { "type": "object", "required": ["prop1"], "properties": { "prop1": { "type": "string" } }, "additionalProperties": false } } }, "else": false }, { "if": { "properties": { "key": { "const": "y" } }, "required": ["key"] }, "then": { "properties": { "data": { "type": "object", "required": ["prop2"], "properties": { "prop2": { "type": "string" } }, "additionalProperties": false } } }, "else": false } ] } } }, "required": ["components"] }
关键优化点
- 修正校验路径:将
prop1/prop2的校验规则移至data子Schema中,完全匹配待校验JSON的结构。 oneOf替代anyOf:确保每个组件只能匹配一种key对应的规则,避免模糊匹配导致的校验漏洞。- 禁用额外属性:在
data层级添加additionalProperties: false,严格限制属性范围——比如key为x时,data中只能存在prop1,无法包含prop2,反之亦然。 - 强化排他性:每个规则添加
else: false,不匹配当前key的组件直接判定为无效。 - 明确必填项:组件层级要求
key和data为必填属性,避免缺失核心字段导致的规则失效。
内容的提问来源于stack exchange,提问作者iwangrozny
相关产品推荐
相关产品推荐

