2015-07-29 3 views
0

У меня есть схема для проверки входящего 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"]}} 
      ] 

     } 
    ] 
} 

ответ

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" 
    } 
    }, 
    "additionalProperties": false, 
    "required": ["title", "storageType"], 
    "anyOf": [ 
    { 
     "properties": { 
     "storageType": { 
      "enum": ["DVD", "HDD"] 
     } 
     }, 
     "required": ["minCapacity", "maxCapacity"] 
    }, 
    { 
     "properties": { 
     "storageType": { 
      "enum": ["Network", "Internet"] 
     } 
     }, 
     "not": { "required": ["maxCapacity", "minCapacity"] } 
    } 
    ] 
} 

P.S. Использование "additionalProperties": false не рекомендуется. Наличие таких вещей, как #/anyOf/1/not, является примером того, как эта функция может быть больше проблем, чем того стоит. Лучшей практикой является просто игнорировать свойства, которые не принадлежат.

+0

Wow!Я так зациклился на попытке что-то сделать с помощью enum и зависимостей, я полностью пропустил это решение. Я попробую это. – Anbarasan

+0

Это работает !. Но он не может проверить, когда присутствует только один из свойств емкости. Я обновил вопрос с двумя условиями: Invalid Json 3 и Invalid Json 4. – Anbarasan

+0

Я исправил проблему, используя allOf для не требуемого свойства. У меня есть обновленный вопрос с измененной схемой. Если у вас есть какие-либо отзывы об этом, дайте мне знать. – Anbarasan

Смежные вопросы