JSON 具有强制性 属性 的不同类型数组的架构验证失败

JSON Schema for array of different types with mandatory property fails validation

我创建了以下 draft4 架构:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "$id": "catalog.structs.schema.json",
    "definitions": {
         "geography": {
            "type": "object",
            "description": "Geographical location which may or may not be part of a hierarchy.",
            "properties": {
                "geography_type": {
                    "type": "string",
                    "enum": ["union", "country", "state"] 
                },
                "name": {
                    "type": "string",
                    "enum": ["Turkey", "Netherlands"]
                },
                "parent": {
                    "type": "object",
                    "$ref": "#/definitions/geography"
                }
            },
            "required": ["name"]
        },
        "geography_group": {
            "type": "array",
            "description": "A grouping of discrete geographies that are not necessarily in a common hierarchy.",
            "items": {
                "type" : "object",
                "$ref": "#/definitions/geography"
            }
        }
    },
    "oneOf": [{
        "properties": {
            "geography": { "type": "object", "$ref": "#/definitions/geography"},
            "geography_group" : { "type": "object", "$ref": "#/definitions/geography_group"}
        },
        "additionalProperties": false
    }]
}

以下根据架构正确验证

{"geography":{"name":"Turkey", "geography_type":"country"}}

但是,以下失败说​​明缺少所需的 属性 name

{"geography_group":[{"geography":{"name":"Turkey", "geography_type":"country"}}]}

如果我删除 "required": ["name"] 它会起作用,但我不想删除它。

我做错了什么?

这里有一些误解,但您的想法大体上是正确的。

我不确定您认为 oneOf 在这里做什么。在这种情况下,它根本不是必需的,您可以将 propertiesadditionalProperties 直接放在根架构中。

就您的问题而言,虽然您已将 geography 定义为根级别的 属性,但您尚未对 geography_group 中的项目对象执行此操作值数组。

您想将 geograph_group 定义更改为以下...

"geography_group": {
      "type": "array",
      "description": "A grouping of discrete geographies that are not necessarily in a common hierarchy.",
      "items": {
        "properties": {
          "geograph": {
            "$ref": "#/definitions/geography"
          }
        }
      }
    }

顺便说一句,在 JSON Schema 的 draft-04 中,$ref 旁边的任何关键字都将被忽略。

您在 definitions 对象中使用的密钥与数据验证无关。