2017-11-17 4 views
0

특정 배열 요소가 필요 : 나는 symbolic-name="displayName"JSON 스키마 내가 JSON 스키마로 속성 목록을 정의

에 정확히 하나 개의 속성을 가지고 목록을 필요로 할

{ 
    "$schema": "http://json-schema.org/schema#", 
    "type": "object", 


    "definitions": { 

    "attribute": { 
     "type": "object", 
     "properties": { 
     "symbolic-name": { "type":"string"}, 
     "value": { "type":"string"} 
     }, 
     "required": ["symbolic-name", "value"] 
    }, 

    "displayname": { 
     "type": "object", 
     "properties": { 
     "symbolic-name": {"enum":["displayName"]}, 
     "value": { "type":"string"} 
     }, 
     "required": ["symbolic-name", "value"] 
    } 

    }, 

    "properties": { 
    "attributes":{ 
     "type": "array", 
     // This is the crucial point: 
     "items": {"oneOf": [ 
       {"$ref": "#/definitions/attribute"}, 
       {"$ref": "#/definitions/displayname"} 
     ]}, 
     "uniqueItems": true 
    } 
    } 
} 

을 유효한 데이터 객체가 될 것이다 :

{ 
    "attributes":[ 
    {"symbolic-name": "displayName", "value": "Display Name"}, 
    {"symbolic-name": "somethingElse", "value": "value1"} 
    {"symbolic-name": "somethingElse", "value": "value2"} 
    ] 
} 

이제 displayName 특성이 "oneOf"와 일치 할뿐만 아니라 두 가지 제한 사항이 모두 적용되므로 유효성 검사에 실패합니다. "allOf"로 변경할 수 없습니다. displayName 옆의 다른 모든 속성은 더 이상 일치하지 않기 때문입니다.

답변

1

"oneOf"이 작동하려면 "attribute"및 "displayname"스키마가 서로 겹쳐 쓰여야합니다. 유효한 "displayname"인 것도 유효한 "attribute"입니다. 우리는 "속성"에 대한 유효한 기호 이름 "나 displayName"를 제외하여 그렇게 할 수 있습니다

"symbolic-name": { 
    "type": "string", 
    "not": {"enum": ["displayName"]} 
} 

이제 "나 displayName"의 상징적 인 이름을 가진 요소가 "표시 이름"정의와 일치 할 수 있지만, 일치하지 않을 것 " 속성 "정의.

질문의 다른 부분은 배열에 정확하게 하나의 "displayname"이있는 것입니다. 이것은 더 까다 롭습니다. 또한 사용중인 JSON 스키마 초안에 따라 다릅니다. 4와 6이 구현되었고 7이 월요일에 발표되었습니다 .- 단지 "$schema": "http://json-schema.org/schema#"을 사용한다는 것은 가장 최근의 것을 사용하고 있음을 의미합니다. 즉, 7 일 것입니다. $schema에 대해 특정 초안을 사용하는 것이 좋습니다. 번호가 지정되지 않은 것은 예고없이 변경 될 수 있습니다. . 당신이 배열의 요소가 될 수있는 "표시 이름"을 필요로 확인하는 경우

, 다음이 어떤 초안에서 일 것이다 (그리고 당신도 "oneOf" 필요가 없습니다) :

"items": [{"$ref": "#/definitions/displayname"}], 
"additionalItems": {"$ref": "#/definitions/attribute"} 

여기서 "items"은 배열입니다. 즉, 첫 번째 항목은 반드시 "표시 이름"이어야하며 첫 번째 항목을 초과하는 모든 추가 항목은 "속성"이어야합니다.

"displayname"을 어느 위치에서나 허용하려면 더 어렵습니다. 초안 -06부터는 "contains"이 있으며, 주어진 스키마와 일치시키기 위해 적어도 하나의 항목이 필요합니다. 그러나 "하나 이상의 항목"이라고 말하기는 쉽지 않습니다. 그러나 "minContains""maxContains"은 초안-08에 대한 제안되었습니다 https://github.com/json-schema-org/json-schema-spec/issues/441 지금은

는 희망 당신은 "표시 이름"될 수있는 첫 번째 위치를 필요로 확인되어, 그 모든 초안에서 작동한다.