Как использовать относительный путь для $ref в схеме Json

Скажем, у меня есть схема json с именем child.json.

"$ref": "file:child.json" будет работать

"$ref": "file:./child.json" будет работать

У меня сработали только два относительных пути. Я использую валидатор Python: http://sacharya.com/validating-json-using-python-jsonschema/

У меня проблема: если у меня есть 3 схемы: grandpa.json, parent.json и child.json; дедушка ссылается на родителя, используя «$ref»: «file:parent.json, а родитель ссылается на ребенка, используя «$ref»: «file:child.json. Тогда указанный выше относительный путь больше не работает


person ahri    schedule 24.07.2014    source источник
comment
Кажется, это было решено в следующей проблеме github: github.com/Julian/jsonschema/issues/98.   -  person jruizaranguren    schedule 28.07.2014
comment
Я прочитал этот пост. Означает ли это, что я должен где-то указать абсолютный путь (может быть, внутри моей схемы или внутри валидатора)???? Я не могу просто использовать относительный путь напрямую????   -  person ahri    schedule 30.07.2014
comment
Я так не думаю. Судя по комментариям в посте, дело в загрузке файла и разрешении рефов. Один из них даже создал небольшой инструмент для разыменования: github.com/gazpachoking/jsonref. Вы пробовали то, что они предлагают в посте?   -  person jruizaranguren    schedule 30.07.2014
comment
@nishant Я не знаю, сработает ли это ... Я прочитал ваши сообщения на github и здесь по той же проблеме. Я надеюсь, что вы можете помочь мне в этом   -  person ahri    schedule 30.07.2014


Ответы (1)


Основываясь на проблеме github, связанной с @jruizaranguren, я получил следующее, которое работает как ожидал:

import os
import json
import jsonschema

schema_dir = os.path.abspath('resources')
with open(os.path.join(schema_dir, 'schema.json') as file_object:
    schema = json.load(file_object)

# Your data
data = {"sample": "woo!"}

# Note that the second parameter does nothing.
resolver = jsonschema.RefResolver('file://' + schema_dir + '/', None)

# This will find the correct validator and instantiate it using the resolver.
# Requires that your schema a line like this: "$schema": "http://json-schema.org/draft-04/schema#"
jsonschema.validate(data, schema, resolver=resolver)
person Yep_It's_Me    schedule 23.01.2019