У меня есть схема для проверки входящего JSON,JSON Schema - Динамические требуемые свойства
JSON Schema
{
'title': 'storage schema',
'description': 'storage schema',
'type': 'object',
'properties':{
'title': {
'title':'storage Name',
'type': 'string',
'minLength': 1,
'maxLength': 255
},
'storageType': {
'title': 'storage Type',
'enum' : ['DVD', 'HDD', 'Network', 'Internet']
},
'minCapacity': {
'title': 'Minimum Storage Capacity',
'type': 'number'
},
'maxCapacity': {
'title': 'Maximum Storage Capacity',
'type': 'number'
}
},
'additionalProperties':false,
'required':['title', 'storageType']
}
Я хотел бы иметь minCapacity
и maxCapacity
свойства присутствовать в JSON, если storageType
- DVD
или HDD
и нет в json, если storageType
- Network
.
Это можно сделать, если я модифицирую схему для хранения как объекта и имею минимальную и максимальную емкость как свои свойства, как в приведенной ниже схеме.
{
'title': 'storage schema',
'description': 'storage schema',
'type': 'object',
'properties':{
'title': {
'title':'storage Name',
'type': 'string',
'minLength': 1,
'maxLength': 255
},
'storage': {
'title': 'storage Details',
'type': 'object',
'oneOf' : [{'$ref': '#/storage/disk'},
{'$ref': '#/storage/network'}]
},
},
'additionalProperties':false,
'required':['title', 'storage'],
'storage':{
'disk':{
'properties':{
'type': {
'title': 'Storage Type',
'enum': ['HDD', 'DVD']
},
'minCapacity': {
'title': 'Minimum Storage Capacity',
'type': 'number'
},
'maxCapacity': {
'title': 'Maximum Storage Capacity',
'type': 'number'
}
},
'additionalProperties': false,
'required':['type', 'minCapacity', 'maxCapacity']
},
'network':{
'properties':{
'type': {
'title': 'Storage Type',
'enum': ['Network', 'Internet']
}
},
'additionalProperties': false,
'required':['type']
}
}
}
Но я хотел бы достичь этого, не меняя структуру схемы.
Можно ли это сделать?
Действительно Json 1
{
'title': 'additional mandatory properties',
'storageType': 'HDD',
'minCapacity': 0.1,
'maxCapacity': 1
}
Действительно Json 2
{
'title': 'no additional mandatory properties',
'storageType': 'Network'
}
Недопустимый Json 1
{
'title': 'additional mandatory properties',
'storageType': 'Internet',
'minCapacity': 0.1,
'maxCapacity': 1
}
Invalid Json 2
{
'title': 'no additional mandatory properties',
'storageType': 'HDD'
}
UPDATE
при попытке схемы из jason's ответа, он не проверки, когда только один из не требуется параметров присутствует в JSON. Ниже приведены недействительные JSON.
Недопустимый Json 3
{
'title': 'additional mandatory properties',
'storageType': 'Internet',
'minCapacity': 0.1
}
Недопустимый Json 4
{
'title': 'additional mandatory properties',
'storageType': 'Internet',
'maxCapacity': 1
}
Я решил эту проблему с небольшой модификацией схемы в не требуется части, которая, как показано ниже.
{
"title": "storage schema",
"description": "storage schema",
"type": "object",
"properties": {
"title": {
"title": "storage Name",
"type": "string",
"minLength": 1,
"maxLength": 255
},
"storageType": {
"title": "storage Type"
},
"minCapacity": {
"title": "Minimum Storage Capacity",
"type": "number"
},
"maxCapacity": {
"title": "Maximum Storage Capacity",
"type": "number"
}
},
"required": ["title", "storageType"],
"anyOf": [
{
"properties": {
"storageType": {
"enum": ["DVD", "HDD"]
}
},
"required": ["minCapacity", "maxCapacity"]
},
{
"properties": {
"storageType": {
"enum": ["Network", "Internet"]
}
},
"allOf":[
{"not": {"required": ["maxCapacity"]}},
{"not": {"required": ["minCapacity"]}}
]
}
]
}
Wow!Я так зациклился на попытке что-то сделать с помощью enum и зависимостей, я полностью пропустил это решение. Я попробую это. – Anbarasan
Это работает !. Но он не может проверить, когда присутствует только один из свойств емкости. Я обновил вопрос с двумя условиями: Invalid Json 3 и Invalid Json 4. – Anbarasan
Я исправил проблему, используя allOf для не требуемого свойства. У меня есть обновленный вопрос с измененной схемой. Если у вас есть какие-либо отзывы об этом, дайте мне знать. – Anbarasan