2017-12-28 10 views
1

다른 중첩 객체의 속성 존재 여부에 따라 속성이 필요한 json 스키마 (초안 4)를 작성해야합니다. 나는 이미 행운을 빌면서 많은 것을 검색했다. (anyOf, oneOf, not, dependencies).Json Schema : 특정 중첩 객체에 특정 속성이있는 경우에만 속성을 지정하십시오.

아마도 json 스키마에서이 작업을 수행 할 수 없습니까?

이 내 단순화 된 스키마입니다 :

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": ["dog"], 
    "properties": { 
    "dog": { 
     "type": "object", 
     "required": ["bananas"], 
     "properties": { 
     "bananas": { "$ref": "bananas.json" }, 
     "thing": { 
      "type": "object", 
      "properties": { 
      "total": { "type": "string" } 
      } 
     } 
     } 
    } 
    } 
} 

그리고 이것은 bananas.json

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": ["banana"], 
    "definitions": { 
    "non-empty-string": { 
     "type": "string", 
     "minLength": 1 
    } 
    }, 
    "properties": { 
    "banana": { 
     "type": "array", 
     "minItems": 1, 
     "items": { 
     "type": "object", 
     "required": ["unit"], 
     "properties": { 
      "unit": { "type": "string" }, 
      "thing": { 
      "type": "object", 
      "anyOf": [ 
       { "required": [ "tax_transfers" ] }, 
       { "required": [ "tax_retentions" ] } 
      ], 
      "properties": { 
       "tax_transfers": { 
       "type": "object", 
       "required": ["tax_transfer"], 
       "properties": { 
        "tax_transfer": { 
        "type": "array", 
        "minItems": 1, 
        "items": { 
         "type": "object", 
         "properties": { 
         "rate": { "type": "string" } 
         } 
        } 
        } 
       } 
       }, 
       "tax_retentions": { 
       "type": "object", 
       "required": ["tax_retention"], 
       "properties": { 
        "tax_retention": { 
        "type": "array", 
        "minItems": 1, 
        "items": { 
         "type": "object", 
         "properties": { 
         "rate": { "type": "string" } 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

입니다 내가 필요로하는 배열에 하나 이상의 개체는 바나나에서 (A '일'속성이있는 경우 -> 바나나 -> 건). 그러면 (dog -> thing)의 'thing'속성이 필요합니다.

도움이 될 것입니다.

답변

1

제약 조건을 표현하려면 두 가지가 필요합니다. 첫 번째는 "contains"이고 다른 하나는 "함축적"입니다. definitions 섹션에서 각각을 구성했습니다.

items 키워드는 우리가 배열의 모든 항목이 스키마에 대해 유효 할 것을 요구하고 있습니다

포함합니다. 배열의 모든 항목이 스키마에 대해 유효하지 않은 것이 사실이라면 최소한 하나 이상의 항목이 유효하다는 것을 알고 있습니다. 당신이 JSON 스키마 초안-06로 업그레이드 할 수있는 경우

{ 
    "not": { 
    "items": { "not": { ... schema ... } } 
    } 
} 

이하는 contains 키워드는이 훨씬 쉽게 만들기 위해 추가되었습니다.

{ 
    "contains": { ... schema ... } 
} 

시사점

시사점은 조건부 그런 짓을 할 수 있습니다. 조건 스키마는 조건이 참이거나 제약 조건이 참인 경우 (또는 둘 모두가 참인 경우) 제약 스키마를 내포합니다. 조건이 참이면 제약 조건도 참이어야한다는 것은 사실과 동일합니다. 더 나은이 사건을 해결하기 위해 시도 else 키워드 - then -

{ 
    "anyOf": [ 
    { "not": { ... condition schema ... } }, 
    { ... constraint schema ... } 
    ] 
} 

JSON 스키마 초안-07은 if을 추가합니다. 저는 개인적으로 이것이 충분히 수행 된 방식을 싫어합니다. 나는 이런 종류의 함축적 패턴을 고수 할 것입니다.하지만 여기에서는 그것을 시도하고 싶습니다.

{ 
    "if": { ... schema ... }, 
    "then": { ... schema ... }, 
    "else": { ... schema ... } 
} 

모두 함께

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": ["dog"], 
    "properties": { 
    "dog": { 
     "type": "object", 
     "required": ["bananas"], 
     "properties": { 
     "bananas": { "$ref": "bananas.json" }, 
     "thing": { "type": "object" } 
     } 
    } 
    }, 
    "allOf": [ 
    { "$ref": "#/definitions/banana-things-implies-dog-things" } 
    ], 
    "definitions": { 
    "banana-has-things": { 
     "properties": { 
     "dog": { 
      "properties": { 
      "bananas": { 
       "properties": { 
       "banana": { 
        "not": { 
        "items": { "not": { "required": ["things"] } } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    }, 
    "banana-things-implies-dog-things": { 
     "anyOf": [ 
     { "not": { "$ref": "#/definitions/banana-has-things" }}, 
     { 
      "properties": { 
      "dog": { "required": ["things"] } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

안녕 제이슨, 나는 크게 철저한 설명을 주셔서 감사합니다. json-schema로 복잡한 논리를 만드는 법을 실제로 이해할 수있었습니다. 감사! –