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


person Djiby Thiaw    schedule 13.11.2014    source источник
comment
Это может зависеть от используемой вами библиотеки. Json-схема использует значение ref как допустимый URI. Вы пробовали использовать child.json или file:child.json? Какую библиотеку вы используете и как вы загружаете схему?   -  person jruizaranguren    schedule 14.11.2014


Ответы (3)


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

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

И в дочерней схеме в начале его нужно поставить id вот так

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

person Djiby Thiaw    schedule 19.11.2014

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

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

и он должен решить соответствующим образом.

person cloudfeet    schedule 14.11.2014
comment
Если вы работаете в браузере, стоит отметить, что невозможно получить file:// URL-адреса с помощью AJAX из-за ограничений безопасности. - person cloudfeet; 14.11.2014
comment
Я сделал это, но это не работает, и я до сих пор не знаю, почему - person Djiby Thiaw; 14.11.2014
comment
Можно ли вставить фактическую ошибку? И вы делаете это из JS в браузере? - person cloudfeet; 14.11.2014

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

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

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

person fge    schedule 17.11.2014
comment
Я использую модуль jaySchema, и чтобы получить схему, я просто делаю что-то вроде этого var schema = require('../../contract/entities/operation.json'); затем я вызываю эту функцию для проверки: js.validate(req.body, schema). Это хороший способ сделать это ?? - person Djiby Thiaw; 17.11.2014
comment
Хм, подождите... Эта часть программного обеспечения вообще использует json-schema-validator? - person fge; 17.11.2014
comment
Weah это основано на json-schema-validator - person Djiby Thiaw; 18.11.2014