How to manage multiple JSON schema files?
In JSON Schemas, you can either put a schema per file and then access them using their URL (where you stored them), or a big schema with id
tags.
Here is for one big file:
{
"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"
}
}
}
You can then reference your validator to one of those sub schemas (which are defined with an id
).
From outside of your schema, this:
{ "$ref": "url://to/your/schema#root/properties/book" }
is equivalent to this:
{ "$ref": "url://to/your/schema#book" }
… which is equivalent, from inside, to this:
{ "$ref": "#root/properties/book" }
or this (still from inside):
{ "$ref": "#book" }
See my answer here for more information.
Ray Yun
Social Game Developer who is wandering strange dungeons...
Updated on February 09, 2020Comments
-
Ray Yun almost 4 years
I'm trying to validate my JSON API using node.js + json-schema.js from commonjs-utils. Just single validation was easy but could not find right way how to manage multiple schema files to enable referencing each other.
Suppose that I got two Models & two APIs.
// 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" } } } }
Each schema should be divided in separate file and be online? Or Can I combine into single schema file like below? If it is possible, how can I reference local schema?
// single schema file { "book": { ... }, "author": { ... }, "authors": { ... }, "books": { ... } }
-
uzay95 over 8 yearsIs there any way to create object with separated schema files in node.js?
-
Flavien Volken over 8 years@uzay95 schemas are not classes. A schema is used for defining and validating the structure of an object, a class defines the structure of an object after it's initialisation. If you need classes in js, try looking at Typescript, AtScript or ES6. Or simply put a module or constructor factory method within an external file you will include in node.js.