2017-10-09 21 views
1

필요합니다 : "A"가 될 수jsonschema 검증 조건부 나는 항상 2 개 개의 호텔이 JSON 개체의 유효성을 검사 할 필요가

  • 유형
  • 이름

유형을, "B"또는 "C",

유형이 "A"인 경우 속성 "foo"가 필요하며 추가 속성이 허용되지 않습니다.

는 OK :

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
} 

확인하지 않음 :

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
    "lol": "a" 
} 

타입이 "B"입니다

는 필요한 재산 "바"와 추가 속성을 사용할 수 있습니다.

유형이 "C"이고 속성 "bar"가 필요하며 선택적으로 "zen"속성도있을 수 있습니다.

OK :

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
    "zen": "a" 
} 

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
} 

확인하지 않음 :

{ 
    "type": "C", 
    "name": "a", 
    "bar": "a", 
    "lol": "a" 
} 

불행하게도이 question에 뛰어난 답이 부분적으로 내 경우를 포함, 그러나 나는 나를 위해 작동하는 jsonschema을 구축하는 것을 처리하지 않았다.

편집 :

다음은 내가 시도한 것입니다.

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "object", 
    "properties": { 
     "type": { 
      "type": "string", 
      "enum": ["A", "B", "C"] 
     }, 
     "name": {"type": "string"}, 
     "foo": {"type": "string"}, 
     "bar": {"type": "string"}, 
     "zen": {"type": "string"}, 
    }, 
    "anyOf": [ 
     { 
      "properties": {"type": {"enum": ["A"]}}, 
      "required": ["foo"], 
     }, 
     { 
      "properties": {"type": {"enum": ["B"]}}, 
      "required": ["bar"], 
     }, 
     { 
      "properties": {"type": {"enum": ["C"]}}, 
      "required": ["bar"], 
     }, 
    ] 
} 

내 문제는 "실행 하는가"의 개체 내부 false로 필드 "additionalProperties"로 설정 나에게 예상되는 결과를 제공하지 않습니다. 는 추가 속성 "LOL"

{ 
    "type": "A", 
    "name": "a", 
    "foo": "a", 
    "lol": "a" 
} 
+0

필자가 시도한 예제와이 솔루션이 저에게 맞지 않는 이유를 포함하여 게시물을 업데이트했습니다. – cunfusu

답변

0

JSON 스키마는 각 서브 스키마의 제약이 개별적으로 평가됩니다 제약 시스템을 가지고에도 불구하고

는 예를 들어 다음과 같은 JSON 유효성 검사를 전달합니다. 즉, "additionalProperties"는 동일한 직접적인 스키마 객체 내의 "속성"또는 "patternProperties"만 "볼"수 있습니다.

또한 "속성"및 "패턴 속성"에서만 "필수"를 기반으로하는 속성을 볼 수 없습니다.

"additionalProperties"를 설정 한 경우 : anyOf 브랜치 내부에서 유일하게 허용되는 속성은 "유형"이므로 아무 것도 작동하지 않습니다. 그렇게하고 "유형"이 아닌 다른 속성을 허용하는 경우 사용중인 구현을 알고 싶습니다.

+0

기본적으로 엄격한 스키마를 구현하는 유일한 방법은 anyOf를 정확히 검증하는 스키마 목록과 함께 사용하는 것입니다. 필요한 것은 일부 속성을 재사용하고 싶지만 가능하지 않은 것 같습니다. – cunfusu

+0

초안 -04에서 예, 맞습니다. –

+0

초안 -06에서는 'propertyNames'를 사용하여 재사용 할 수 있습니다 (간결하지는 않지만). –