嵌套数组对象中特定值的JSON Schema验证失效问题排查
嵌套JSON Schema验证失效的原因与解决方法
问题场景
我有一个包含图片的JSON文件,每张图片对应多个Versions版本,需要验证特定维度的版本数据。当前使用的JSON Schema错误地让不符合要求的JSON通过了验证(本应拒绝):
不符合要求的JSON示例:
{ "Images": [ { "Versions": [ { "imgProperties": "x" }, { "imgProperties": "z" } ] } ] }
当前使用的Schema:
{ "Images": { "type": "array", "minItems": 1, "items": { "type": "object", "properties": { "Versions": { "type": "array", "allOf": [ { "contains": { "type": "object", "properties": { "imgProperties": { "type": "string", "pattern": "foo1|bar1" } }, "required": [ "imgProperties" ] } }, { "contains": { "type": "object", "properties": { "imgProperties": { "type": "string", "pattern": "foo2|bar2" } }, "required": [ "imgProperties" ] } } ] } } } } }
单独验证Versions数组时逻辑正常,但嵌套到整个Schema后验证失效。
原因分析
你的Schema存在结构不规范问题:
- JSON Schema的顶级结构必须是一个对象,且需明确指定
"type": "object" - 顶级属性
Images没有被包裹在properties字段内,直接作为Schema的顶级键,导致验证引擎无法正确识别这是对JSON根对象中Images字段的约束规则。单独验证Versions数组时,目标是数组本身,结构匹配所以生效;但嵌套后整个Schema不符合规范,验证引擎会忽略无效的结构定义,导致约束不生效。
解决方法
修正Schema的顶级结构,添加"type": "object"并将Images字段放入properties中,确保整个Schema符合JSON Schema规范:
修正后的Schema:
{ "type": "object", "properties": { "Images": { "type": "array", "minItems": 1, "items": { "type": "object", "properties": { "Versions": { "type": "array", "allOf": [ { "contains": { "type": "object", "properties": { "imgProperties": { "type": "string", "pattern": "foo1|bar1" } }, "required": ["imgProperties"] } }, { "contains": { "type": "object", "properties": { "imgProperties": { "type": "string", "pattern": "foo2|bar2" } }, "required": ["imgProperties"] } } ] } }, "required": ["Versions"] } } }, "required": ["Images"] }
额外优化:
- 添加
required字段,确保Images和Versions字段必须存在,避免遗漏必填项的验证 - 保留原有的
allOf+contains逻辑,确保Versions数组同时包含符合foo1|bar1和foo2|bar2规则的版本项
内容的提问来源于stack exchange,提问作者DevQandA
相关产品推荐
相关产品推荐

