web-dev-qa-db-fra.com

Comment gérer plusieurs fichiers de schéma JSON?

J'essaie de valider mon API JSON en utilisant node.js + json-schema.js à partir de commonjs-utils. Une seule validation a été facile, mais n'a pas pu trouver la bonne façon de gérer plusieurs fichiers de schéma pour permettre le référencement mutuel.

Supposons que j'ai deux modèles et deux 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" } }
  }
}  

Chaque schéma doit être divisé dans un fichier séparé et être en ligne? Ou puis-je combiner en un seul fichier de schéma comme ci-dessous? Si c'est possible, comment puis-je référencer le schéma local?

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

Dans les schémas JSON, vous pouvez soit mettre un schéma par fichier, puis y accéder en utilisant leur URL (où vous les avez stockés), ou un grand schéma avec des balises id.

Voici pour un gros fichier:

{
    "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"
        }
    }
}

Vous pouvez ensuite référencer votre validateur à l'un de ces sous-schémas (qui sont définis avec un id).

En dehors de votre schéma, ceci:

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

est équivalent à ceci:

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

… Ce qui équivaut, de l'intérieur, à ceci:

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

ou ceci (toujours de l'intérieur):

{ "$ref": "#book" }

Voir mon réponse ici pour plus d'informations.

49
Flavien Volken