2013-10-17 1 views
10

예를 들어 파일 시스템 스키마는 파일 목록을 포함합니다. 스키마는 파일의 스펙, 하위 유형 "이미지"및 다른 하나의 "텍스트"로 구성됩니다.속성 값에서 스키마를 선택하도록 JSON 스키마 유효성 검사기를 지정하는 방법은 무엇입니까?

아래에는 기본 디렉토리 스키마가 있습니다. 디렉토리에는 파일의 하위 유형이어야하는 항목의 배열 인 특성 내용이 있습니다.

기본적으로 내가 찾고있는 것은 유효성 검사기에게 유효성이 검사되는 json 개체의 속성에서 "$ ref"값을 조회하도록 지시하는 방법입니다.

예 JSON :

{ 
    "name":"A directory", 
    "content":[ 
     { 
      "fileType":"http://x.y.z/fs-schema.json#definitions/image", 
      "name":"an-image.png", 
      "width":1024, 
      "height":800 
     } 
     { 
      "fileType":"http://x.y.z/fs-schema.json#definitions/text", 
      "name":"readme.txt", 
      "lineCount":101 
     } 
     { 
      "fileType":"http://x.y.z/extended-fs-schema-video.json", 
      "name":"demo.mp4", 
      "hd":true 
     } 

    ] 
} 

"이미지"와 "텍스트"정의는 동일한 스키마에 포함되어 있지만 다른

{ "id": "http://x.y.z/fs-schema.json", "definitions": { "file": { "type": "object", "properties": { "name": { "type": "string" }, "fileType": { "type": "string", "format": "uri" } } }, "image": { "allOf": [ { "$ref": "#definitions/file" }, { "properties": { "width": { "type": "integer" }, "height": { "type": "integer"} } } ] }, "text": { "allOf": [ { "$ref": "#definitions/file" }, { "properties": { "lineCount": { "type": "integer"}}} ] } }, "type": "object", "properties": { "name": { "type": "string"}, "content": { "type": "array", "items": { "allOf": [ { "$ref": "#definitions/file" }, { *"$refFromProperty"*: "fileType" } // the magic thing ] } } } } 

을 정의 할 수있는 "의사"스키마
참고
+0

설명이 필요합니다. 디렉터리 데이터가 정의 될 때 (디자인 타임이 아닐 때) 정의 된 특정 속성을 fullfil하여 디렉터리의 모든 파일 항목을 적용하려고합니다. 맞습니까? – jruizaranguren

+0

속성의 하위 유형에 대한 올바른 정의를 선택하고 싶습니다. fileType – redben

답변

9

JSON 스키마의 유효성 검사 부분만으로는이를 수행 할 수 없습니다. 이는 고정 된 구조를 나타냅니다. 원하는 것은 유효성 확인시에 스키마 해석/참조가 필요합니다.

그러나, 당신이 사용하는 JSON 하이퍼 스키마 및 rel="describedby" 링크를 표현할 수있다 :

그래서 여기
{ 
    "title": "Directory entry", 
    "type": "object", 
    "properties": { 
     "fileType": {"type": "string", "format": "uri"} 
    }, 
    "links": [{ 
     "rel": "describedby", 
     "href": "{+fileType}" 
    }] 
} 

, 그것은 "fileType"에서 값을 받아 관계 "describedby"로 연결되는 링크를 계산하는 데 사용을 - 즉 "이 위치의 스키마는 현재 데이터를 설명합니다"를 의미합니다.

대부분의 유효성 검사기는 ("describedby"를 포함하여) 어떤 링크라도 통지하지 않습니다. 당신은 "하이퍼 밸리데이터"를 찾아야합니다.

UPDATE는 다음 tv4 라이브러리는 기능

+0

고마워요,이 트릭을하는 것처럼 보입니다. 그래도 말하듯이 "하이퍼 밸리데이터"를 찾아야하거나 자신을 굴려 야합니다! – redben

+0

고맙습니다 cloudfeet! 그것이 내가 찾고있는 해답이다.이제는 분리 된 스키마를 유지해 보겠습니다. URI를 계산하기 위해 보간법을 사용하고 위에서 설명한 것처럼 describeBy rel의 href 값에 보간을 사용할 수 있다고 가정합니다. 답변을 게시 해 주셔서 감사합니다. –

+0

JS를 지원하는 유효성 검사기에 대해 알고 계십니까? –

3

내가 cloudfeet 대답은 유효한 솔루션입니다 생각하는이 추가되었습니다. 동일한 접근법 described here을 사용할 수도 있습니다.

정의 할 모든 부속 유형의 "anyOf"일 수있는 파일 오브젝트 유형이 있습니다. 각 하위 유형을 참조하고 유효성을 검사 할 수 있으려면 열거 형을 사용하십시오.

하위 유형 스키마가 동일한 Json-Schema 파일에있는 경우 "$ ref"로 명시 적으로 URI를 참조 할 필요가 없습니다. 올바른 draft4 유효성 검사기는 enum 값을 찾고 Json-Schema 트리에서 해당 "subschema"에 대해 유효성 검사를 시도합니다.

draft5 (진행 중)에서 "전환"진술이 제안되어보다 명확한 방법으로 대안을 표현할 수 있습니다.

+1

잘 모르기 때문에 열거 형 옵션이 아닙니다. 저작 시간에 가능한 모든 하위 유형. "이미지"와 "텍스트"를 알고 있지만 누군가 자신의 별도 스키마에 하위 유형의 "파일"을 추가 할 수 있습니다. OOP에서 "파일"은 인터페이스 또는 추상 API 클래스에 매핑됩니다. – redben

+0

문제가 없습니다. 인터페이스를 확장하는 메소드는 추가 enum 값에 대한 정보를 가지고 있으며 OOP에서 기본 인터페이스와 확장 기능에 대한 지식이있는 것과 동일한 방식으로 적용 할 수 있습니다. – jruizaranguren

+0

나는 이해할 것 같지 않습니다. 하위 유형의 (fileType) 속성에 enum을 사용하면 ok이지만 스키마는 "fileType"의 값이 유효하지 않은 것을 확인합니다. 반면에 "OOP는 기본 인터페이스에 대한 지식이 있으며 확장 기능 ". 기본 추상 클래스를 확장하거나 인터페이스를 구현하기 위해 다른 확장이 무엇인지 알 필요가 없습니다. – redben