How to manage multiple JSON schema files?

27,889

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.

Share:
27,889
Ray Yun
Author by

Ray Yun

Social Game Developer who is wandering strange dungeons...

Updated on February 09, 2020

Comments

  • Ray Yun
    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
    uzay95 over 8 years
    Is there any way to create object with separated schema files in node.js?
  • Flavien Volken
    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.