2017-01-24 1 views
1

두 속성은 항상 선택 사항이지만 다른 (항상 필수) 부울 속성의 값이 참된.oneOf (v4 또는 v5)를 사용하는 JSON 스키마에서 중복 제거

항상 선택 사항이지만 항상 허용되는 것은 아닌 속성은 이름이 max_recurrencesrecurrence_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, triggerarguments 한 번 전체 스키마에.

답변

1

JSON 스키마 초안-04 : 당신이 AJV를 사용하는 경우 사용자 정의 키워드를 사용하여 위의 단순화 할 수 있습니다

{ 
    "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"] } 
     } 
     } 
    } 
    ] 
} 

이 (V5이 아닌 다른 곳에서 사용되는 개념이기 때문에 내가 그렇게 가정) "만약/다음/다른" 초안 07에 제안되어 있고 일부 지원이있는 "금지 된"- 그들은 ajv-keywords에 정의되어 있습니다. "실행 하는가가"로 대체 할 수 있습니다

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

편집 :

사실, 사용자 정의 키워드없이 "종속"키워드와 함께 더 간단 할 수 있습니다. 대신 "실행 하는가"의 :

이 스키마는`recurrence_arguments`와`max_recurrences`이 ** recurring``의 값에 따라 ** 요구해야하는지 여부를 결정하는 것 같습니다
"dependencies": { 
    "max_recurrences": { "$ref": "#recurring" }, 
    "recurrence_arguments": { "$ref": "#recurring" } 
}, 
"definitions": { 
    "recurring": { 
    "id": "#recurring", 
    "properties": { 
     "recurring": { "enum": [true] } 
    } 
    } 
} 
+1

. 그건 내가 실제로 원하는 것이 아니다. 필드는 절대 필요하지 않지만'recurring'이'true'가 아닌 경우에는 허용해서는 안됩니다. – LukeP

+0

어떤 옵션을 의미합니까? – esp

+0

편집 내용은 실제로 원하는 것처럼 보이지만'recurring'이 true 인 경우 필요한 필드를 만드는 것처럼 맨 위 2 번 모습입니다. 나는 틀린가? – LukeP