如何构建JSON Schema有条件验证数组内嵌套文档字段?
问题
示例JSON文档:
{"level0key1": "foo0", "level0key2": "bar0", "level0array1": [ { "level1key1": "foo1-0", "level1key2": "bar1-0" }, { "level1key1": "foo1-1", "level1key2": "bar1-1" } ], "level0doc1": { "dockey1": "foo-doc-1", "dockey2": "foo-doc-2" } }
需求:构建JSON Schema验证——当level0key1等于foo0时,level0array1中的每个元素必须包含level1key1字段。
现有JSON Schema:
{"$schema": "https://json-schema.org/draft/2019-09/schema", "title": "test", "type": "object", "required": [], "properties": { "level0key1": { "type": "string" }, "level0key2": { "type": "string" }, "level0array1": { "type": "array", "properties": { "level1key1": { "type": "string" }, "level1key2": { "type": "string" } } } }, "allOf": [{ "if": { "properties": { "level0key1": { "const": "foo0" } }, "required": ["level0key1"] }, "then": { "required": ["level0key2"] } }, { "if": { "properties": { "level0key1": { "const": "foo0" } }, "required": ["level0key1"] }, "then": { "required": ["level0array1/[]/level1key1"] } } ] }
问题:allOf中第一个验证正常工作,但第二个验证始终失败。尝试过调整路径语法(星号、点号替代斜杠)、将条件放在level0array1定义内均未解决,需要修复提示。
解决方案
错误原因
你在then中用required: ["level0array1/[]/level1key1"]的写法完全错误——JSON Schema的required关键字仅能指定当前层级的必填字段,无法通过路径语法指向嵌套结构的字段。要验证数组元素的必填字段,必须在数组的items关键字中定义元素约束。
修复后的Schema
{ "$schema": "https://json-schema.org/draft/2019-09/schema", "title": "test", "type": "object", "properties": { "level0key1": { "type": "string" }, "level0key2": { "type": "string" }, "level0array1": { "type": "array", "items": { "type": "object", "properties": { "level1key1": { "type": "string" }, "level1key2": { "type": "string" } } } }, "level0doc1": { "type": "object", "properties": { "dockey1": { "type": "string" }, "dockey2": { "type": "string" } } } }, "allOf": [ { "if": { "properties": { "level0key1": { "const": "foo0" } }, "required": ["level0key1"] }, "then": { "required": ["level0key2"] } }, { "if": { "properties": { "level0key1": { "const": "foo0" } }, "required": ["level0key1"] }, "then": { "properties": { "level0array1": { "items": { "required": ["level1key1"] } } }, "required": ["level0array1"] } } ] }
关键修复点
- 修正数组基础定义:原Schema中数组用
properties关键字是错误的,数组的元素约束必须通过items定义,已在基础属性中修正。 - 嵌套约束数组元素:在
then的properties.level0array1里,通过items.required指定数组每个元素必须包含level1key1字段。 - 确保数组存在:添加
required: ["level0array1"]到then中,保证当level0key1为foo0时,数组本身必须存在(否则无法验证其元素,根据实际需求可调整)。
内容的提问来源于stack exchange,提问作者vizete
相关产品推荐
相关产品推荐

