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
在这里做什么。在这种情况下,它根本不是必需的,您可以将 properties
和 additionalProperties
直接放在根架构中。
就您的问题而言,虽然您已将 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
对象中使用的密钥与数据验证无关。
我创建了以下 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
在这里做什么。在这种情况下,它根本不是必需的,您可以将 properties
和 additionalProperties
直接放在根架构中。
就您的问题而言,虽然您已将 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
对象中使用的密钥与数据验证无关。