You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建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"]
      }
    }
  ]
}

关键修复点

  1. 修正数组基础定义:原Schema中数组用properties关键字是错误的,数组的元素约束必须通过items定义,已在基础属性中修正。
  2. 嵌套约束数组元素:在then的properties.level0array1里,通过items.required指定数组每个元素必须包含level1key1字段。
  3. 确保数组存在:添加required: ["level0array1"]到then中,保证当level0key1为foo0时,数组本身必须存在(否则无法验证其元素,根据实际需求可调整)。

内容的提问来源于stack exchange,提问作者vizete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:20:39