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
对象中定义(并且您没有定义任何对象)。
- 所有项目都必须验证
Entity
或 NavEntity
之一。
如果你去掉最后一个"additionalProperties": false
,一切正常。而且您不需要它,因为 Entity
和 NavEntity
都包含它。
提议的架构:
{
"$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" }
]
}
}
}
}
我正在尝试构建一个 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
对象中定义(并且您没有定义任何对象)。 - 所有项目都必须验证
Entity
或NavEntity
之一。
如果你去掉最后一个"additionalProperties": false
,一切正常。而且您不需要它,因为 Entity
和 NavEntity
都包含它。
提议的架构:
{
"$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" }
]
}
}
}
}