我想在我的模式中使用一个数组(项(。数组中的每个对象都可以是模式中列出的"框架类型"之一。
我正在开发的模式如下:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [
"Campaign_name",
"Legals"
],
"properties": {
"Campaign_name": {
"type": "string",
"minLength": 3
},
"Legals": {
"type": "object",
"properties": {
"legal-button-label": {
"type": "string",
"minLength": 6
},
"legal-text": {
"type": "string",
"minLength": 15
}
}
},
"Banner_120x600": {
"type": "object",
"properties": {
"serve-backup": {
"type": "object",
"properties": {
"choice": {
"type": "string",
"enum": [
"yes",
"no"
]
},
"image": {
"type": "string",
"pattern": "^([a-zA-Z|-]+)([.])(gif|jpeg|jpg|png)$"
}
}
},
"background": {
"type": "string",
"pattern": "^([a-zA-Z|-]+)([.])(gif|jpeg|jpg|png)$"
},
"logo": {
"type": "string",
"pattern": "^([a-zA-Z|-]+)([.])(gif|jpeg|jpg|png)$"
},
"loop": {
"type": "integer",
"enum": [
0,
1,
2
]
},
"frames": {
"type": "array",
"minItems": 1,
"maxItems": 6,
"items": {
"oneOf": [
{
"$ref": "#/frame-type/INTRO-FRAME"
},
{
"$ref": "#/frame-type/OFFER-FRAME-TYPE-1"
}
]
}
}
}
}
},
"frame-type": {
"INTRO-FRAME": {},
"OFFER-FRAME-TYPE-1": {}
}
}
然而,JSON不会根据模式进行验证。我正在开发的JSON如下所示:
{
"Campaign_name": "OSM DT DATA",
"Legals": {
"legal-button-label": "Click for Legals",
"legal-text": "Requires 3G/Wi-Fi. Content depends..."
},
"Banner_120x600": {
"serve-backup": {
"choice": "no",
"image": "backup.jpg"
},
"background": "background.png",
"logo": "sky-logo.png",
"loop": 2,
"frames": [
{
"type": "INTRO-FRAME"
},
{
"type": "OFFER-FRAME-TYPE-1"
}
]
}
}
"oneOf": [
{
"$ref": "#/frame-type/INTRO-FRAME"
},
{
"$ref": "#/frame-type/OFFER-FRAME-TYPE-1"
}
]
两个achema都是空的,如果一个对象与多个模式匹配,oneOf就会失败,因为任何文档都与空模式匹配,所以情况总是如此。您可以将oneOf更改为anyOf。
"frames": {
"type": "array",
"minItems": 1,
"items": [
{
"type" : "object",
"properties" : {
"type" : { "enum" : ["INTRO-FRAME"] }
}
},
{
"type" : "object",
"properties" : {
"type" : { "enum" : ["OFFER-FRAME-TYPE-1"] }
}
},
{
"type" : "object",
"properties" : {
"type" : { "enum" : ["OFFER-FRAME-TYPE-2"] }
}
},
{
"type" : "object",
"properties" : {
"type" : { "enum" : ["CONTENT-FRAME"] }
}
}
]
}
我删除了"oneOf"的使用,并提供了一个对象数组进行验证。