2017-02-10 1 views
0

jsonschema.RefResolver를 사용하여 스키마에서 다중 참조를 어떻게 검증 할 수 있습니까?Jsonschema RefResolver를 사용하여 파이썬에서 다중 참조를 해결할 수 있습니다.

파일에 참조가 하나있는 경우 유효하게 작동하는 유효성 검사 스크립트가 있습니다. 이제 다른 디렉토리에있는 스키마에 2 ~ 3 개의 참조가 있습니다.

base_dir = '/schema/models/' 
with open (os.path.join(base_dir, 'Defined.json')) as file_object: 
    schema = json.load(file_object) 
    resolver = jsonschema.RefResolver('file://' + base_dir + '/' + 'Fields/Ranges.json', schema) 
    jsonschema.Draft4Validator(schema, resolver=resolver).validate(data) 

내 JSON 스키마 :

{ 
    "properties": { 
    "description": { 
     "type": "object", 
     "after": {"type": ["string", "null"]}, 
     "before": {"type": "string"} 
     }, 
     "width": {"type": "number"} , 
     "range_specifier": {"type": "string"}, 
     "start": {"type": "number", "enum" : [0, 1] } , 
     "ranges": { 
     "$ref": "Fields/Ranges.json" 
     }, 
     "values": { 
     "$ref": "Fields/Values.json" 
     } 
    } 
} 

나는 두 리졸버 값의 범위에 대해 하나 하나를 가지고 Draft4Validator에서 개별적으로 해결 프로그램을 호출해야합니다 그래서 내 질문은? 아니면 이것을 할 수있는 더 좋은 방법이 있습니까?

답변

1

나는이 해결 방법은 다른 사람

에 유용하다는 것을 나 자신이 내가 희망 같은 문제에 몇 시간을 보냈어요
def validate(schema_search_path, json_data, schema_id): 
    """ 
    load the json file and validate against loaded schema 
    """ 
    try: 
     schemastore = {} 
     schema = None 
     fnames = os.listdir(schema_search_path) 
     for fname in fnames: 
      fpath = os.path.join(schema_search_path, fname) 
      if fpath[-5:] == ".json": 
       with open(fpath, "r") as schema_fd: 
        schema = json.load(schema_fd) 
        if "id" in schema: 
         schemastore[schema["id"]] = schema 

     schema = schemastore.get("http://mydomain/json-schema/%s" % schema_id) 
     Draft4Validator.check_schema() 
     resolver = RefResolver("file://%s.json" % os.path.join(schema_search_path, schema_id), schema, schemastore) 
     Draft4Validator(schema, resolver=resolver).validate(json_data) 
     return True 
    except ValidationError as error: 
     # handle validation error 
     pass 
    except SchemaError as error: 
     # handle schema error 
     pass 
    return False 
경로 확인에 사용되어야한다

모든 JSON 스키마가 통과해야하는 ID 요소가 schema_id 인수

"id": "http://mydomain/json-schema/myid" 

모든 스키마가 딕셔너리에로드 한 다음 저장소로 리졸버에 전달됩니다으로 확인한다. 예제에서 다른 디렉토리의 스키마도로드해야합니다.