JSON 模式验证 - oneOf 与混合对象类型的数组

JSON schema validdation - oneOf with array of mixed object type

我正在尝试构建一个 JSON 模式,其中 JSON 数据具有一组混合对象类型。我正在尝试使用 oneOf,但是,我似乎遗漏了一些东西,因为我的 JSON 数据无法根据架构进行验证。

以下是我目前所做的。

Schema:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "definitions": {
        "Entity": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "Property": {
                    "type": "string"
                },
                "Value": {
                    "type": "string"
                }
            },
            "required": [ "Property", "Value" ]
        },
        "NavEntity": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "Property": {
                    "type": "string"
                },
                "NavigationalEntities": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Entity"
                    }
                }
            },
            "required": [ "Property", "NavigationalEntities" ]
        }
    },
    "additionalProperties": true,
    "name": "/",
    "properties": {
        "Entities": {
            "type": "array",
            "minLength": 1,
            "uniqueItems": true,
            "items": {
                "oneOf": [
                    { "$ref": "#/definitions/Entity" },
                    { "$ref": "#/definitions/NavEntity" }
                ],
                "additionalProperties": false
            }
        }
    }
}

这是我的 JSON 数据:

{
    "Entities": [
        {
            "Property": "ABC",
            "NavigationalEntities": [
                {
                    "Property": "ABC1",
                    "Value": "123"
                }
            ]
        },
        {
            "Property": "ABCD",
            "Value": "ABCD"
        }
    ]
}

当我尝试对此进行验证时,出现错误:"Additional properties not allowed"。这个也可以看here.

请让我知道我在这里遗漏了什么。

问题出在 Entities 属性 中的 items 关键字中包含 "additionalProperties": false。 您同时指定了:

  • 所有项目不应该有任何额外的属性 在 items 对象中定义(并且您没有定义任何对象)。
  • 所有项目都必须验证 EntityNavEntity 之一。

如果你去掉最后一个"additionalProperties": false,一切正常。而且您不需要它,因为 EntityNavEntity 都包含它。

提议的架构:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "definitions": {
        "Entity": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "Property": {
                    "type": "string"
                },
                "Value": {
                    "type": "string"
                }
            },
            "required": [ "Property", "Value" ]
        },
        "NavEntity": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "Property": {
                    "type": "string"
                },
                "NavigationalEntities": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Entity"
                    }
                }
            },
            "required": [ "Property", "NavigationalEntities" ]
        }
    },
    "additionalProperties": true,
    "name": "/",
    "properties": {
        "Entities": {
            "type": "array",
            "minLength": 1,
            "uniqueItems": true,
            "items": {
                "oneOf": [
                    { "$ref": "#/definitions/Entity" },
                    { "$ref": "#/definitions/NavEntity" }
                ]
            }
        }
    }
}