Схема JSON $ref не работает для относительного пути

У меня есть 3 схемы:

дочерняя схема:

{
    "title": "child_schema",
    "type": "object",
    "properties": {
        "wyx":{
            "type": "number"
        }
     },
    "additionalProperties": false,
    "required": ["wyx"]
}

родительская схема:

{
    "title": "parent",
    "type": "object",
    "properties": {
        "x": {
            "type": "number"
        },
        "y": {
            "type": "number"
        },
        "child": {
            "$ref": "file:child.json"
        }
    }
}

схема дедушки:

{
    "type": "object",
    "title": "grandpa",
    "properties": {
        "reason": {
            "$ref": "file:parent.json"
        }
    },
    "additionalProperties": false
}

Как видите, у gradpa есть ссылка на родителя, а у родителя есть ссылка на дочерний элемент. Все эти 3 файла находятся в одной папке. Когда я использую валидатор Python для проверки схемы дедушки, я продолжаю получать ошибку RefResolutionError.

ОДНАКО, если у меня нет дедушки, и я просто использую родительскую схему и дочернюю схему, все работает!! Итак, проблема в том, что я не могу иметь ссылку, указывающую на ссылку (2 уровня). Но у меня может быть ссылка, указывающая на схему (всего 1 уровень).

интересно, почему


person ahri    schedule 05.08.2014    source источник
comment
У меня есть такая проблема с использованием модуля jaySchema, и вот мое решение: stackoverflow.com/questions/26920482/   -  person Djiby Thiaw    schedule 20.11.2014


Ответы (1)


Ваши ссылки неверны. Если указанные схемы находятся в одной папке, используйте простые ссылки относительного пути, например:

"child": {"$ref": "child.json"},
"reason": {"$ref": "parent.json"}

Если вы используете для проверки jsonschema, не забудьте установить резолвер ссылки для разрешения пути к указанным схемам:

import os
from jsonschema import validate, RefResolver

instance = {}
schema = grandpa

# this is a directory name (root) where the 'grandpa' is located
schema_path = 'file:///{0}/'.format(
      os.path.dirname(get_file_path(grandpa)).replace("\\", "/"))
resolver = RefResolver(schema_path, schema)
validate(instance, schema, resolver=resolver)
person Alex-Bogdanov    schedule 14.10.2015