2017-01-24 12 views
1

У меня есть набор из 2 свойств, которые всегда являются необязательными, но должны быть разрешены только в том случае, если значение другого (всегда обязательного) булевого свойства равно правда.Удаление дублирования в схеме JSON, которая использует oneOf (v4 или v5)

Свойства, которые всегда являются необязательными, но не всегда разрешены, называются: max_recurrences и recurrence_arguments. Логическое свойство, значение которого true, от которого они зависят, называется: recurring.

Я придумал схему ниже, которая, как я думаю, работает, но я дублирую все другие свойства в каждом элементе массива oneOf. Я ищу способ избежать этого дублирования.

{ 
    "id": "plan_schedule", 
    "type": "object", 
    "oneOf": [ 
    { 
     "properties": { 
     "start_date": { 
      "type": "string", 
      "format": "date-time" 
     }, 
     "end_date": { 
      "type": "string", 
      "format": "date-time" 
     }, 
     "trigger": { 
      "$ref": "re_non_empty_string" 
     }, 
     "arguments": { 
      "type": "object", 
      "minProperties": 1 
     }, 
     "recurring": { 
      "type": "boolean", 
      "enum": [true], 
     }, 
     "max_recurrences": { 
      "type": "integer", 
      "minimum": 1 
     }, 
     "recurrence_arguments": { 
      "type": "object", 
      "minProperties": 1 
     } 
     } 
    }, 
    { 
     "properties": { 
     "start_date": { 
      "type": "string", 
      "format": "date-time" 
     }, 
     "end_date": { 
      "type": "string", 
      "format": "date-time" 
     }, 
     "trigger": { 
      "$ref": "re_non_empty_string" 
     }, 
     "arguments": { 
      "type": "object", 
      "minProperties": 1 
     }, 
     "recurring": { 
      "type": "boolean", 
      "enum": [false], 
     }, 
     } 
    } 
    ], 
    "additionalProperties": false, 
    "required": ["start_date", "trigger", "recurring"] 
} 

Может ли кто-нибудь помочь мне? Я бы хотел использовать v4, но я открыт для использования v5, если это помогает.

Для дальнейшего уточнения, я надеюсь только перечислить свойства: start_date, end_date, trigger и arguments один раз во всей схеме.

ответ

1

JSON Schema проект-04:

{ 
    "type": "object", 
    "properties": { 
    "recurring": { 
     "type": "boolean" 
    } 
    // all other properties 
    } 
    "additionalProperties": false, 
    "required": ["start_date", "trigger", "recurring"] 
    "anyOf": [ 
    { 
     "properties": { "recurring": { "enum": [true] } } 
    }, 
    { 
     "properties": { "recurring": { "enum": [false] } }, 
     "not": { 
     "anyOf": [ 
      { "required": ["max_recurrences"] }, 
      { "required": ["recurrence_arguments"] } 
     } 
     } 
    } 
    ] 
} 

Если вы используете AJV (я предполагаю, что это потому, что v5 это понятие нигде не используется) можно упростить выше, используя собственные ключевые слова «если/то/другое» и «запрещены», которые предлагаются для проекта-07 и имеют определенную поддержку - они определены в ajv-keywords. «AnyOf» можно заменить:

"if": { "properties": { "recurring": { "enum": [false] } } }, 
"then": { "prohibited": ["max_recurrences", "recurrence_arguments"] } 

EDIT:

На самом деле, это может быть сделано еще проще с «зависимостями» ключевым словом, без каких-либо пользовательских ключевых слов. Вместо «anyOf»:

"dependencies": { 
    "max_recurrences": { "$ref": "#recurring" }, 
    "recurrence_arguments": { "$ref": "#recurring" } 
}, 
"definitions": { 
    "recurring": { 
    "id": "#recurring", 
    "properties": { 
     "recurring": { "enum": [true] } 
    } 
    } 
} 
+1

Похоже, эта схема решает ли или нет '' recurrence_arguments' и max_recurrences' должны быть ** ** требуется на основе значения 'recurring'. На самом деле это не то, что я ищу. Поля не должны быть обязательными, но не должны допускаться, если 'recurring' не является' true'. – LukeP

+0

какой вариант вы имеете в виду? – esp

+0

Ваше редактирование на самом деле выглядит так, как будто оно делает то, что я хочу, но верхние 2 выглядят так, как будто они делают нужными поля, если 'recurring' истинно. Я ошибаюсь? – LukeP