Json架构未验证/使用子架构



我有如下所示的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,因此它必须针对所有对象进行验证,或者重写此条件以不在此处使用对象。

通过anyOfallOf的修改,您的给定数据现在也验证了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"
}
}
]
}

相关内容

  • 没有找到相关文章

最新更新