2016-11-08 1 views
1

이 단순화 된 JSON-스키마입니다 :JSON-스키마 (가치에 의하여) 조건부 의존성

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "id": "user", 
    "type": "object", 
    "properties": { 
     "account": { 
      "type": "object", 
      "properties": { 
       "type": { 
        "type": "string", 
        "enum": ["COMPANY", "PERSON"] 
       } 
      }, 
      "required": ["type"] 
     }, 
     "person": { 
      "type": "object", 
      "properties": { 
       "firstName": { "type": "string" }, 
       "lastName": { "type": "string" } 
      }, 
      "required": ["firstName", "lastName"] 
     }, 
     "company": { 
      "type": "object", 
      "properties": { 
       "name": { "type": "string" }, 
       "taxNumber": { "type": "string" } 
      } 
     } 
    }, 
    "required": ["account", "person"] 
} 

내가 달성하고자하는 것은 : account.type"COMPANY"로 설정되어

  • 경우 가
    • company 개체 및 그 속성은 이어야합니다.이어야합니다.
  • "PERSON"로는 isset account.type 경우
    • company객체옵션해야한다.
    • company 개체가있는 경우 company.namecompany.taxNumber이어야하며이어야합니다.

이는 oneOf에서 두 개의 긴 서브 스키마를 정의하지만이 account 때문에 너무 많은 중복과 복잡한 스키마를 의미하고 company이 단순화 된 버전보다 더 많은 속성이 있습니다에 의해 달성 될 수있다.

AFAIK, 스키마에서 특정 값을 정의하는 유일한 방법은 enum 키워드를 단일 항목과 함께 사용하는 것입니다. dependencies 키워드로 시도했지만 도움이되지 않았습니다.

데이터 객체의 구조를 변경하지 않고도 생각할 수 있습니까?

+0

어떤 언어를 사용하고 있습니까? 자바 스크립트입니까? – esp

+0

JS하지만 언어는 중요하지 않습니다. 이 작업은 JS 코드가 아닌 JSON 스키마 내에서 수행해야합니다. –

답변

3

Ajv (전 저자) 인 JSON-schema v5/6 제안서의 switch 키워드를 사용하여이 요구 사항을 표현할 수 있습니다.

+0

저는 이미 Ajv를 사용하고 있습니다. 나는'v5 : true'를 가능하게하고'switch' 키워드를 시도 할 것입니다. 감사. –

+0

다른 필드 값의 값에 따라 필드의 스키마를 변경할 수 있습니까? 예를 들어 "a"가 'TRUE'이면 "b"는 "FOO"여야합니다. 그렇지 않으면 "FOO 또는 BOO" – Daniel