2014-05-12 6 views
1

원격 스키마 "person.json"을 다른 파일에 저장했습니다.원본 스키마의 동일한 수준에서 원격 JSON 스키마의 속성 재사용

{ 
    "id":"#person", 
    "type":"object", 
    "properties": { 
     "name": {"type":"string"}, 
     "gender": { 
      "type":"string", 
      "enum":["m", "f"] 
     }, 
     "age": {"type":"number"} 
    }, 
    "additionalProperties": false 
} 

는 그리고 나는이 하나 내 원래 스키마 존재하는 "man.json"스키마를 가지고있다. "턱수염, 콧수염"man.json에서 : 동일한 수준의 속성으로에 person.json에서 "이름, 성별 등"

{ 
    "id":"#man", 
    "type":"object", 
    "$ref":"person.json", 
    "properties": { 
     "beard":"boolean", 
     "moustache":"boolean" 
    }, 
    "required": ["name"], 
    "additionalProperties": false 
} 

나는 속성을 사용하고 싶습니다. 검증 나는 당신이 볼과 같은 레벨 (중첩되지 않음)에서 모든 속성과 함께, 이전에 표시된 예를 유효성을 검사 할

{ 
    name: 'John', 
    gender: 'm', 
    age: 29, 
    beard: false, 
    moustache: true 
} 

에 대한

예.

이것이 가능합니까? 그렇다면 어떻게? 고맙습니다.

주앙

답변

1

당신은 $ref과 결합 allOf 키워드를 사용하려면 :

{ 
    "id": "/schemas/man.json", 
    "allOf": [{"$ref": "person.json"}], 
    ... 
} 

(참고 :이 V4이다 v3에서 같은 일이 extends를 불렀다..)

일반 영어에서는 "Man Schema 다음의 모든 인스턴스도 Person 스키마를 따라야"합니다.

더 큰 문제는 실제로를 사용하는 것입니다. person.json은 추가 속성을 금지하므로 "beard" 속성이있는 인스턴스는 실제로 이 아니며 유효한 사람이 아닙니다. Person을 확장하려고한다면 추가 속성을 금지하는 제약 조건을 제거하는 것이 좋습니다.

(참고 :.이 동작은 JSON 스키마 사회에서 어떤 분쟁의 대상이지만,이 사양에 무엇이입니다)

+0

json은 그런 중요한 기능을 지원하지 않습니다. 나는 "additional properties = false"를 삭제할 수 없습니다. 중복 된 코드를 사용했습니다. 좋은 해결책은 아니지만 원하는대로 작동합니다. 고맙습니다. – joaorodr84

+0

additionalProperties의 해결 방법은 person에 대한 추상적 인 baseclass를 가질 수 있습니다. additionalProperties를 금지하지 않는 abstractPerson 클래스이며 allOf와 함께 사람과 사람 모두에 포함될 수 있습니다. – fiddur

0

나는 당신이 그들을 결합 세 번째 스키마를 생성하고 그 유효성을 확인해야하므로 데이터의 조각, 한 번에 두 스키마를 만족시킬 수 없다 같은데요.

var personSchema = JSON.parse(person_json); 
var manSchema = JSON.parse(man_json) 

for (var personProp in personSchema.properties) { 
    manSchema.properties[personProp] = personSchema.properties[personProp]; 
} 

var manPersonSchema = JSON.stringify(manSchema); 
+0

귀하의 솔루션은 좋은 것 같다. 유일한 문제는 다른 파일에 내 스키마가 있다는 것입니다. 그것들을 가져오고 병합하는 것이 그것보다 더 어려울 것입니다. 나는 그것을 다른 방식으로했다. 어쨌든 고마워. – joaorodr84