Как управлять несколькими файлами схемы JSON?

Я пытаюсь проверить свой JSON API, используя node.js + json-schema.js из commonjs-utils. Просто одиночная проверка была простой, но я не мог найти правильный способ управления несколькими файлами схемы, чтобы можно было ссылаться друг на друга.

Предположим, что у меня есть две модели и два API.

// book
{
  "type": "object",
  "properties": {
      "title": { "type": "string" },
      "author": { "type": "string" }
  }
}
// author
{
  "type": "object",
  "properties": {
      "first_name": { "type": "string" },
      "last_name": { "type": "string" }
  }
}  
// authors API
{
  "type": "array",
  "items": { "$ref": "author" }
}
// books API: list of books written by same author
{
  "type": "object",
  "properties": {
    "author": { "$ref": "author" } 
    "books": { "type": "array", "items": { "$ref": "book" } }
  }
}  

Каждая схема должна быть разбита на отдельный файл и быть онлайн? Или я могу объединить в один файл схемы, как показано ниже? Если возможно, как я могу ссылаться на локальную схему?

// single schema file {
    "book": { ... },
    "author": { ... },
    "authors": { ... },
    "books": { ... } }

person Ray Yun    schedule 18.11.2011    source источник


Ответы (1)


В схемах JSON вы можете либо поместить схему для каждого файла, а затем получить к ним доступ, используя их URL-адрес (где вы их сохранили), либо большую схему с тегами id.

Вот для одного большого файла:

{
    "id": "#root",
    "properties": {
        "author": {
            "id": "#author",
            "properties": {
                "first_name": {
                    "type": "string"
                },
                "last_name": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        // author
        "author_api": {
            "id": "#author_api",
            "items": {
                "$ref": "author"
            },
            "type": "array"
        },
        // authors API
        "book": {
            "id": "#book",
            "properties": {
                "author": {
                    "type": "string"
                },
                "title": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        // books API: list of books written by same author
        "books_api": {
            "id": "#books_api",
            "properties": {
                "author": {
                    "$ref": "author"
                },
                "books": {
                    "items": {
                        "$ref": "book"
                    },
                    "type": "array"
                }
            },
            "type": "object"
        }
    }
}

Затем вы можете сослаться на свой валидатор на одну из этих подсхем (которые определены с помощью id).

Извне вашей схемы это:

{ "$ref": "url://to/your/schema#root/properties/book" }

эквивалентно этому:

{ "$ref": "url://to/your/schema#book" }

что эквивалентно изнутри этому:

{ "$ref": "#root/properties/book" }

или это (еще изнутри):

{ "$ref": "#book" }

См. мой ответ здесь Чтобы получить больше информации.

person Flavien Volken    schedule 31.01.2012
comment
Есть ли способ создать объект с отдельными файлами схемы в node.js? - person uzay95; 30.04.2015
comment
Схемы @uzay95 не являются классами. Схема используется для определения и проверки структуры объекта, класс определяет структуру объекта после его инициализации. Если вам нужны классы на js, попробуйте взглянуть на Typescript, AtScript или ES6. Или просто поместите фабричный метод модуля или конструктора во внешний файл, который вы включите в node.js. - person Flavien Volken; 01.05.2015