我正在尝试使用来自commonjs-utils的node.js + json-schema.js验证我的JSON API。单一验证很容易,但是找不到正确的方法来管理多个架构文件以实现相互引用。
假设我有两个模型和两个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": { ... } }
在JSON模式中,您可以为每个文件放置一个模式,然后使用其URL(存储它们的位置)或带有id标签的大模式来访问它们。
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" }