我有如下所示的json。我想把它和一个必须有zoo_unique_code的动物园列表对照起来。但可以有动物或鸟类,也可以两者兼而有之,或者两者都没有。但如果它有动物或鸟类,例如bird/animal_id,我想用子模式来验证它。子模式似乎不起作用。
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {
"animal_id": {
"type": "string",
"maxLength": 24
},
"bird_id": {
"type": "string",
"maxLength": 50
},
"zoo_bird_and_animal": {
"type": "object",
"anyOf": [{
"properties": {
"zoo_bird": {
"type": "object",
"required": [
"zoo_bird_id"
],
"properties": {
"zoo_bird_id": {
"$ref": "#/definitions/bird_id"
}
}
}
}
}, {
"properties": {
"zoo_animal": {
"type": "object",
"required": [
"zoo_animal_id"
],
"properties": {
"zoo_animal_id": {
"$ref": "#/definitions/animal_id"
}
}
}
}
}
]
}
},
"properties": {
"zoo_list": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": [
"zoo_unique_code"
],
"minProperties": 1,
"properties": {
"zoo_unique_code": {
"type": "string",
"enum": [
"NEWYORKZOO",
"PARISZOO"
]
}
},
"$ref": "#/definitions/zoo_bird_and_animal"
}
}
}
}
并用进行测试
{
"zoo_list": [
{
"zoo_unique_code": "NEWYORKCODE",
"zoo_bird": {
"zoo_bird_id": "newid"
}
}
]
}
任何建议都将不胜感激。
就我所能解释的模式而言,您似乎希望在最后使用组合模式,而不是在相同的项部分中使用ref
。
有了这个allOf
,模式需要是一个有效的对象,就像在items
中定义的一样,就像definitions
中的ref
一样
另外,另一个错误来自于使用anyOf
而不是allOf
。
对于anyOf
,它需要对第一个或第二个模式有效,因为两者都对对象有效,即使第一个无效,第二个也是有效的,所以一切都是有效的。additionalProperties
也可以改变这一点,但它不会以嵌套的方式工作
anyOf
:只要一个值对这两种模式中的任何一种都有效,它就被认为对整个组合模式有效。-组合模式
您还希望在此处使用allOf
,因此它必须针对所有对象进行验证,或者重写此条件以不在此处使用对象。
通过anyOf
到allOf
的修改,您的给定数据现在也验证了bird_id
:
我认为你在这里没有使用draft-04
,看起来像draft-7
。
{
"type": "object",
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {
"animal_id": {
"type": "string",
"maxLength": 24
},
"bird_id": {
"type": "string",
"maxLength": 50
},
"zoo_bird_and_animal": {
"type": "object",
"allOf": [
{
"properties": {
"zoo_bird": {
"type": "object",
"required": [
"zoo_bird_id"
],
"properties": {
"zoo_bird_id": {
"$ref": "#/definitions/bird_id"
}
}
}
}
},
{
"properties": {
"zoo_animal": {
"type": "object",
"required": [
"zoo_animal_id"
],
"properties": {
"zoo_animal_id": {
"$ref": "#/definitions/animal_id"
}
}
}
}
}
]
}
},
"properties": {
"zoo_list": {
"type": "array",
"minItems": 1,
"items": {
"allOf": [
{
"type": "object",
"required": [
"zoo_unique_code"
],
"minProperties": 1,
"properties": {
"zoo_unique_code": {
"type": "string",
"enum": [
"NEWYORKZOO",
"PARISZOO"
]
}
}
},
{
"$ref": "#/definitions/zoo_bird_and_animal"
}
]
}
}
}
}
无效数据,请参阅:无效:
{
"zoo_list": [
{
"zoo_unique_code": "NEWYORKCODE",
"zoo_bird": {
"zoo_bird_id": "newidnewidnewidnewidnewidnewidnewnewidnewidnewidnewidnewidnewidnew"
}
}
]
}
有效数据,参见有效:
{
"zoo_list": [
{
"zoo_unique_code": "NEWYORKZOO",
"zoo_bird": {
"zoo_bird_id": "newid"
}
}
]
}