Схема JSON: ссылка на локальную дочернюю схему

Я хочу сослаться на дочернюю схему в родительской схеме JSON. Вот дочерняя схема с именем child.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 не найден. Я проверял много вещей, но все работают.
Спасибо за вашу помощь

3 ответа

Решение

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

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

И в дочерней схеме в начале его, вы должны поставить идентификатор на него, как это

{
    "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
Это мое решение, но оно не самое лучшее, и я надеюсь, что оно поможет. Спасибо всем за ваши ответы

$ref значения могут быть ссылками URI - они не должны быть абсолютными URI. Так что здесь, вы должны просто иметь возможность использовать:

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

и это должно решить соответственно.

Если ваши родительские и дочерние схемы находятся в classpath и в одном и том же месте, то лучше всего использовать пользовательские resource Схема URI для загрузки с абсолютным URI:

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

Затем вы можете ссылаться на вашу дочернюю схему, используя { "$ref": "child.json" } (поскольку ссылки JSON разрешаются относительно URI текущей схемы)

Другие вопросы по тегам