2016-08-02 2 views
16

В jsonSchema вы можете указать, являются ли определенные поля являются обязательными или не используется «необходимый» атрибут:атрибут jsonSchema условно требуется

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
     "header": { 
      "type": "object", 
      "properties": { 
       "messageName": { 
        "type": "string" 
       }, 
       "messageVersion": { 
        "type": "string" 
       } 
      }, 
      "required": [ 
       "messageName", 
       "messageVersion" 
      ] 
     } 
    }, 
    "required": [ 
     "header" 
    ] 
} 

В некоторых случаях, я хотел бы messageVersion поле не является обязательным. Есть ли способ сделать обязательное условие этого поля условным?

+0

Да, это должно быть возможно. Какая информация в данных вызовет обязательность? – jruizaranguren

+0

Как это сделать с версией 3? –

+0

@SarveswaranMeenakshiSundaram - Я не знаю, что я использовал v4 схемы json. –

ответ

41

В зависимости от вашей ситуации существует несколько разных подходов. Я могу думать о четырех разных способах условно требовать поля.

Зависимости

dependencies ключевого слова является условным изменением required ключевого слова. Свойство Foreach в dependencies, если свойство присутствует в проверяемом JSON, то также должна быть действительна схема, связанная с этим ключом. Если свойство «Foo» присутствует, то свойство «бар» требуется

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "dependencies": { 
    "foo": { "required": ["bar"] } 
    } 
} 

Существует также краткая форма, если схема содержит только required ключевое слово.

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "dependencies": { 
    "foo": ["bar"] 
    } 
} 

Причастность

Если ваше состояние зависит от значения поля, вы можете использовать логическое логическое понятие под названием подразумевается. «A подразумевает B» эффективно означает, что если A истинно, то B также должно быть истинным. Вывод также может быть выражен как «! A или B». Либо свойство «foo» не равно «bar», либо свойство «bar» требуется. Или, другими словами: Если свойство «Foo» равно «бар», то свойство «бар» требуется

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "anyOf": [ 
    { 
     "not": { 
     "properties": { 
      "foo": { "enum": ["bar"] } 
     }, 
     "required": ["foo"] 
     } 
    }, 
    { "required": ["bar"] } 
    ] 
} 

Если «Foo» не равно «бар», #/anyOf/0 матчи и проверки преуспевает. Если «foo» равно «bar», #/anyOf/0 не работает, и #/anyOf/1 должен быть действительным для подтверждения валидации anyOf.

Enum

Если условно основан на перечислении, это немного более прямо вперед. "foo" может быть "bar" или "baz". Если «foo» равно «bar», тогда требуется «bar». Если «foo» равно «baz», тогда требуется «baz».

{ 
    "type": "object", 
    "properties": { 
    "foo": { "enum": ["bar", "baz"] }, 
    "bar": { "type": "string" }, 
    "baz": { "type": "string" } 
    }, 
    "anyOf": [ 
    { 
     "properties": { 
     "foo": { "enum": ["bar"] } 
     }, 
     "required": ["bar"] 
    }, 
    { 
     "properties": { 
     "foo": { "enum": ["baz"] } 
     }, 
     "required": ["baz"] 
    } 
    ] 
} 

If-Then-Else

Относительно новое дополнение к JSON Schema (проект-07) добавляет if, then и else ключевые слова. Если свойство "Foo" равно "бар", то свойство "бар" требуется

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "if": { 
    "properties": { 
     "foo": { "enum": ["bar"] } 
    } 
    }, 
    "then": { "required": ["bar"] } 
} 

EDIT 12/23/2017: Причастность раздел обновляется и If-Then-Else добавлен раздел.

+2

Удивительный ответ, спасибо. Это полностью соответствует моему сценарию! –

+0

Это просто такая полезная ссылка. Возвращаясь к нему ежедневно :) – Owen

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