2017-02-10 14 views
0

Как мы можем проверить несколько ссылок в схеме с помощью jsonschema.RefResolver?Jsonschema RefResolver для решения нескольких ссылок в python

У меня есть скрипт проверки, который работает хорошо, если у меня есть один ref в файле. Теперь у меня есть две или три ссылки в схеме, которые находятся в другом каталоге.

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 схема, которая должна использоваться в разрешении пути имеет идентификационный элемент, который должен быть передан чтобы проверить, как schema_id аргумента

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

Все схемы загружаются в Словаре, а затем передается в распознаватель в качестве хранилища. В вашем примере вы также должны загрузить схему из другого каталога.