Схема 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 текущей схемы)