Вот моя пересмотренная проблема, и я заимствую то же обучение, которое я изучил в одном из вопросов. Я добавил свою схему и JSON внизу этого вопроса.
Критерии:
- Каждый объект региона всегда будет иметь атрибут «регион» и может иметь другие различные атрибуты ивложенный объект JSON тоже. (Обратите внимание, что объект не имеет подобного атрибута, и поэтому я использую определения)
- Массив должен содержать по крайней мере один объект региона, но может быть ТОЛЬКО типа: Австралия или Азия или Европа ДОЛЖНЫ с другим типом объекта региона,[Австралия, Азия или Европа не могут сосуществовать друг с другом]
- Схема JSON должна пожаловаться на отсутствующий обязательный атрибут.
Таким образом, это условие действительно:
Здесь массив представляет собой ["stat_data": {}, {}, {}]
- [{"asia"}] // или в европе или австралии
- [{"some-pencil-region "}, {" asia "}]
- [{" some-карандаш-region "}, {some-oil-pastels-region}, {" asia "}]
- [{some-oil-pastels-region}, {"europe"}]
- [{"some-карандаш-region"}, {"europe"}]
и это условие недопустимо:
- []
- [{"some-карандаш-регион"}, {"asia"}, {"europe"} {australia}]// Азия, Европа, Австралия не могут совместно выйти
- [{some-oil-pastels-region}, {"some-карандаш-region"}, {"asia"}, {"asia"},{australia}] // азия, европа, австралия не может совместно выйти
- [{"some-карандаша-регион"}] // Отсутствует: либо Азия, либо Европа, либо Австралия должны быть там вместе с другим объектом
Схема JSON
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"Pencils": {
"contains": {
"properties": {
"region": {
"const": "some-pencil-region"
},
"details": {
"type": "object",
"required": [
"brand",
"year"
],
"properties": {
"brand": {
"type": "string"
},
"year": {
"type": "number"
}
}
}
}
}
},
"OilPastels": {
"contains": {
"required": [
"population"
],
"properties": {
"region": {
"const": "some-oil-pastels-region"
},
"details": {
"type": "object",
"properties": {
"size": {
"type": "number"
}
}
}
}
}
},
"containsAsia": {
"contains": {
"required": [
"population"
],
"properties": {
"region": {
"const": "asia"
},
"population": {
"type": "object",
"required": [
"year"
],
"properties": {
"year": {
"type": "number"
},
"change": {
"type": "number"
}
}
}
}
}
},
"containsEurope": {
"contains": {
"properties": {
"region": {
"const": "europe"
},
"tourist": {
"type": "number"
}
}
}
},
"containsAustralia": {
"contains": {
"properties": {
"region": {
"const": "australia"
},
"stadium": {
"type": "object",
"required": [
"year"
],
"properties": {
"year": {
"type": "number"
},
"area": {
"type": "number"
}
}
}
}
}
}
},
"type": "object",
"properties": {
"stat_data": {
"type": "array",
"minItems": 1,
"items": {
"type": "object"
},
"oneOf": [
{
"$ref": "#/definitions/Pencils"
},
{
"$ref": "#/definitions/OilPastels"
},
{
"allOf": [
{
"$ref": "#/definitions/containsAsia"
},
{
"not": {
"$ref": "#/definitions/containsEurope"
}
},
{
"not": {
"$ref": "#/definitions/containsAustralia"
}
}
]
},
{
"allOf": [
{
"$ref": "#/definitions/containsEurope"
},
{
"not": {
"$ref": "#/definitions/containsAsia"
}
},
{
"not": {
"$ref": "#/definitions/containsAustralia"
}
}
]
},
{
"allOf": [
{
"$ref": "#/definitions/containsAustralia"
},
{
"not": {
"$ref": "#/definitions/containsAsia"
}
},
{
"not": {
"$ref": "#/definitions/containsEurope"
}
}
]
}
]
}
}
}
JSON (это не удалось) [Я испробовал всю свою проверку, но все тщетно]
{
"stat_data":[
{
"region":"some-pencil-region",
"details":{
"brand":"Camlin",
"year": 2019
}
},
{
"region":"asia",
"population":{
"year":2018,
"change":2
}
}
]
}
10/06 Не проверяется обязательный атрибут LINK1