2014-11-13 3 views
1

부모 json 스키마에서 하위 스키마를 참조하려고합니다. 다음은 child.json이라는 하위 스키마입니다.JSON 스키마 : 로컬 하위 스키마 참조

{ 
"$schema": "http://json-schema.org/draft-04/schema#", 
"title": "Child", 
"description": "Child schema", 
"type": "object", 
"properties": { 
    "name": {"type": "string"}, 
    "age": {"type": "integer"} 
}} 

이며 여기에는 parent.json이라는 상위 스키마가 있으며 두 파일은 모두 같은 폴더에 있습니다. 자식 스키마를 참조하고 싶습니다. 다음과 같이합니다.

{ 
"$schema": "http://json-schema.org/draft-04/schema#", 
"title": "Parent", 
"description": "Parent schema", 
"type": "object", 
"properties": { 
"allOf": [ 
    { 
     "$ref": "file://child.json" 
    } 
], 
"adresse": {"type": "string"} 
}} 

child.json 파일을 찾을 수 없다는 오류가 발생했습니다. 나는 많은 소리를 테스트했지만 아무도 일하고 ​​있지 않습니다.
도움을 주셔서 감사합니다.

+0

사용하는 라이브러리에 따라 다를 수 있습니다. Json-schema는 ref 값을 유효한 URI로 사용합니다. "child.json"또는 "file : child.json"으로 시도해 보셨습니까? 어떤 라이브러리를 사용하고 있으며 스키마를 어떻게로드합니까? – jruizaranguren

답변

2

내 문제에 대한 해결책을 찾았습니다. 해결책은 다음과 같습니다
우리는 항상 부모와 자식이라는 두 가지 스키마가 있다는 점이 다릅니다. 부모는이 파 exemple 같은 자신의 특성 중 하나에 자식 스키마를 포함 할 필요가 :

"myChild": { 
     "$ref": "child" //referencing to child schema 
} 

그리고 그의 시작 부분에 아이의 스키마에, 당신은이

처럼에 ID를 넣어 가지고
{ 
    "id": "child", //important thing not to forget 
    "$schema": "http://json-schema.org/draft-04/schema#" 
    //other codes goes here 
} 

이제 jaySchema와 검증을 위해이

var js = new JaySchema(); 
var childSchema = require('./child.json'); 
var parentSchema = require('./parent.json'); 

//other codes goes here 
js.register(childSchema); //important thing not to forget 
js.validate(req.body, schema, function(err) { 
    if (err) //your codes for err 
}); 

같이 할 것입니다 그리고 그것은 전부입니다. :-D
이것은 내 해결책이지만 최선은 아니며 도움이되기를 바랍니다. 모든 답변 주셔서 감사합니다

1

$ref 값은 절대 URI 일 필요가 없습니다. 여기에서 다음을 사용할 수 있습니다.

{"$ref": "child.json"} 

적절히 해결해야합니다. 당신의 부모와 자식 스키마 클래스 패스와 같은 장소에있는 경우

+0

브라우저를 사용하는 경우 보안 제한으로 인해 AJAX를 사용하여'file : //'URL을 가져올 수 없다는 점에 유의할 가치가 있습니다. – cloudfeet

+0

나는 해냈다.하지만 제대로 작동하지 않고 여전히 왜 그런지 모르겠다. –

+0

실제 오류를 붙여 넣을 수 있습니까? 그리고 JS에서 브라우저에서이 작업을 수행하고 있습니까? – cloudfeet

0

는 할 수있는 가장 좋은 것은 절대 URI로로드를 위해 사용자 정의 resource URI 구성표를 사용하는 것입니다

final JsonSchema schema = factory.getJsonSchema("resource:/path/to/parent.json"); 

그럼 당신은 { "$ref": "child.json" }을 사용하여 하위 스키마를 참조 할 수 있습니다 (JSON 참조가 현재 스키마의 URI와 비교되어 해결되기 때문에)

+0

나는 jaySchema 모듈을 사용하고 있으며 스키마를 얻으려면 "var schema = require ('../../ contract/entities/operation.json');" 그럼 난 유효성 검사를 위해 그 함수를 호출 : "js.validate (req.body, schema)". 그것을하는 좋은 방법일까요 ?? –

+0

Hmmwait ...이 소프트웨어 조각은 실제로 json-schema-validator를 사용합니까? – fge

+0

weah 그것은 json-schema-validator를 기반으로합니다. –