我有下面显示的json。我想让它针对必须具有zoo_unique_code的Zoo列表工作。但是可以有动物或鸟类,或者两者都有,也可以没有。但是我想用子模式验证它是否具有动物或鸟类,例如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"
}
}
]
}
任何建议将不胜感激。
答案 0 :(得分:0)
据我所知,您似乎想在最后使用组合模式,而不是在同一项目中使用ref
。
有了这个allOf
,模式就必须是有效的对象,就像items
中定义的一样,就像ref
中的definitions
另一个错误来自使用anyOf
而不是allOf
。
对于anyOf
,它必须针对第一个或第二个模式都有效,因为两者都针对一个对象进行验证,即使第一个模式无效,第二个模式也有效,因此所有内容都是有效的。也可以使用additionalProperties
进行更改,但是这样不能像嵌套它那样工作。
anyOf
:只要值针对这些架构中的任何一个进行验证,就被视为针对整个组合架构有效。 -combining-schemas
您还希望在此处使用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"
}
]
}
}
}
}
无效数据,请参阅:invalid:
{
"zoo_list": [
{
"zoo_unique_code": "NEWYORKCODE",
"zoo_bird": {
"zoo_bird_id": "newidnewidnewidnewidnewidnewidnewnewidnewidnewidnewidnewidnewidnew"
}
}
]
}
有效数据,请参见valid:
{
"zoo_list": [
{
"zoo_unique_code": "NEWYORKZOO",
"zoo_bird": {
"zoo_bird_id": "newid"
}
}
]
}