2016-12-14 1 views
1

필요한 필드 사이에 2 개의 oneOf를 사용할 때 작동하는 json 스키마가 있습니다. 그러나 옵션 필드를 사용하여 동일한 작업을 수행하는 방법을 알지 못합니다.2 oneOf in json 스키마 : 1 필수 1 선택 가능

내 스키마 :

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "properties": { 
    "a": { 
     "type": "number" 
    }, 
    "b": { 
     "type": "number" 
    }, 
    "c": { 
     "type": "number" 
    }, 
    "d": { 
     "type": "number" 
    }, 
    "e": { 
     "type": "number" 
    } 
    }, 
    "required": ["a"], 
    "oneOf": [ 
    {"required": ["b"]}, 
    {"required": ["c"]} 
    ], 
    "oneOf": [ 
    {"required": ["d"]}, 
    {"required": ["e"]} 
    ] 
} 

이 (한 번에 결코 모두가없는 동안) 어떻게 개발하게 변환 할 수 및 선택 전자?

답변

1

gist with my solutionhttp://jsonschemalint.com으로 표시됩니다. (매우 편리한 도구입니다!)

속성 de은 이미 정의되어 있으며 필수 항목은 아닙니다. 이 두 가지 속성이 상호 배타적하기 위해, 우리는 인스턴스가 not 두 속성이있는 스키마와 일치해야한다는 말 :

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "properties": { 
    "a": {"type": "number"}, 
    "b": {"type": "number"}, 
    "c": {"type": "number"}, 
    "d": {"type": "number"}, 
    "e": {"type": "number"} 
    }, 
    "required": ["a"], 
    "oneOf": [ 
     {"required": ["b"]}, 
     {"required": ["c"]} 
    ], 
    "not" : {"required" : ["d","e"]} 
} 

이 잘 작동,하지만 당신은 당신의 상호 배타적 인 이상 두 가지 속성이있는 경우는 지저분한 점점 시작 그룹. 여기에 더 자세한의 대안이지만까지 확장

"not" : { 
    "anyOf"{ 
     {"required" : ["d","e"]}, 
     {"required" : ["d","f"]}, 
     {"required" : ["e","f"]}, 
    } 
    } 

: 우리는 재산 f을 추가하고 de에 대한이 상호 배타적 만들고 싶었다 예를 들어, 우리는 세 가지 조합을 허용해야 할 것 상호 배타적 인 속성의 큰 세트 :

"oneOf" : [ 
    {"required" : ["d"]}, 
    {"required" : ["e"]}, 
    {"required" : ["f"]}, 
    { 
     "not" : { 
     "anyOf" : [ 
      {"required" : ["d"]}, 
      {"required" : ["e"]}, 
      {"required" : ["f"]} 
     ] 
     } 
    } 
    ] 

그룹에 추가 된 각 속성에는 정확히 두 행이 필요합니다.

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "properties": { 
    "a": {"type": "number"}, 
    "b": {"type": "number"}, 
    "c": {"type": "number"}, 
    "d": {"type": "number"}, 
    "e": {"type": "number"}, 
    "f": {"type": "number"} 
    }, 
    "required": ["a"], 
    "allOf": [ 
    { 
     "oneOf": [ 
      {"required": ["b"]}, 
      {"required": ["c"]} 
     ] 
    }, 
    { 
     "oneOf" : [ 
     {"required" : ["d"]}, 
     {"required" : ["e"]}, 
     {"required" : ["f"]}, 
     { 
      "not" : { 
      "anyOf" : [ 
       {"required" : ["d"]}, 
       {"required" : ["e"]}, 
       {"required" : ["f"]} 
      ] 
      } 
     } 
     ] 
    } 
    ] 
} 
+0

감사를 도와 : 우리의 스키마가 이제 두 개의 oneOf 제약이 있기 때문에

, 우리는 allOf를 사용하여 결합해야합니다. 해결책으로 '{ "a": 1, "b": 1}'또는 "{"a ": 1,"c ": 1}'는 유효하지 않지만 필요합니다. 내 사건에 어떻게 적응할 수 있습니까? – lovelace63

+1

솔루션을 보여주기 위해 예제와 설명을 업데이트했습니다. 잘 잡으세요! –

+1

lovelace63, 내 대답을 수락 한 후, 나는 \t 훨씬 깨끗한 솔루션을 발견했다. 이 옵션은 선택적 속성 목록을 반복 할 필요가 없으므로 유지 관리가 더 쉽습니다. 또한 필수 또는 선택적으로 상호 배타적 인 여러 속성 집합을 쉽게 만들 수 있습니다. 제발, 당신이 이것에 어떤 문제라도 보시면 저에게 알려주세요. –

관련 문제