我需要验证以下数组项。
{
contents: [{
type: "text",
content: "This is text context"
}, {
type: "image",
content: "http://image.url"
}]
}
我需要验证contents数组中的每个项目。
每个内容对象都应具有type
和content
属性。
type
可以是" text"," image"或"视频"。
对于图片或视频,content
应该是有效的网址。
为此,我编写了以下架构。
{
"id": "post",
"description": "generell schema for a post",
"definitions": {
"contents": {
"type": "array",
"minItems": 1,
"items": {
"allOf": [
{ "$ref": "#/definitions/text" },
{ "$ref": "#/definitions/image" },
{ "$ref": "#/definitions/video" },
{ "$ref": "#/definitions/mention" }
]
}
},
"text": {
"properties": {
"type": {"enum": ["text"]},
"content": {"type": "string"}
},
"required": [
"content",
"type"
]
},
"image": {
"properties": {
"type": {"enum": ["image"]},
"content": {
"type": "string",
"format": "url"
}
},
"required": [
"content",
"type"
]
},
"video": {
"properties": {
"type": {"enum": ["video"]},
"content": {
"type": "string",
"format": "url"
}
},
"required": [
"content",
"type"
]
}
}
}
但是JSON以上对我的架构无效。它说data.contents[0].type should be equal to one of the allowed values
如果我使用oneOf而不是allOf它是有效的。但图像内容可以是没有有效URL的字符串。
什么是正确的架构?
答案 0 :(得分:0)
对于初学者,当您使用allOf
时,您正在使用oneOf
。
根项目还需要属性定义。希望以下更改可帮助您获得所需的解决方案,或指向正确的方向。
{
"id": "post",
"description": "generell schema for a post",
"properties": {
"contents": {
"type": "array",
"minItems": 1,
"items": {
"oneOf": [
{ "$ref": "#/definitions/text" },
{ "$ref": "#/definitions/image" },
{ "$ref": "#/definitions/video" },
{ "$ref": "#/definitions/mention" }
]
}
}
}
"definitions": {
"text": {
"properties": {
"type": {"enum": ["text"]},
"content": {"type": "string"}
},
"required": [
"content",
"type"
]
},
"image": {
"properties": {
"type": {"enum": ["image"]},
"content": {
"type": "string",
"format": "url"
}
},
"required": [
"content",
"type"
]
},
"video": {
"properties": {
"type": {"enum": ["video"]},
"content": {
"type": "string",
"format": "url"
}
},
"required": [
"content",
"type"
]
}
}
}