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