Utiliser les JSON Schema

Il existe depuis quelques temps une spécification afin de permettre de définir une structure JSON à travers des schémas.

Cette spécification, vous pouvez la retrouver sur le lien suivant: http://json-schema.org/specification.html

Le principe: définir à travers un JSON des règles afin de pouvoir valider d'autres JSON. Cela permet d'avoir comme sur le site http://schema.org/docs/gs.html des schémas de données qui permettent de mieux comprendre les données que nous recevons.

Ainsi, nous pouvons définir le schéma suivant:

'use strict';

module.exports = {
    "title": "Person",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"        },
        "lastName": {
            "type": "string"        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0        }
    },
    "required": ["firstName", "lastName"]
};

Ce dernier indique:
  • Que firstName est une string et est obligatoire
  • Que lastName est une string et est obligatoire
  • Que age est un nombre entier positif et n'est pas obligatoire.

Voyons le bout de code suivant:


'use strict';

const Ajv  = require('ajv');
const ajv  = new Ajv();
const userSchema = require('./user-schema');

let data = {
    firstName: 'John',
    lastName: 'Doe',
    age: 15};

if (!ajv.validate(userSchema, data)) {
    console.error(JSON.stringify(ajv.errors, null, 3));

} else {
    console.info('Data has got a valid schema')
}

Si nous l'exécutons, nous n'aurons pas d'ailleurs car nous remplissons tous les critères.
Essayons maintenant avec un âge à 15.5
Nous obtenons alors l'erreur:


[
   {
      "keyword": "type",
      "dataPath": ".age",
      "schemaPath": "#/properties/age/type",
      "params": {
         "type": "integer"
      },
      "message": "should be integer"
   }
]


Si nous mettons un âge négatif:


[
   {
      "keyword": "minimum",
      "dataPath": ".age",
      "schemaPath": "#/properties/age/minimum",
      "params": {
         "comparison": ">=",
         "limit": 0,
         "exclusive": false
      },
      "message": "should be >= 0"
   }
]

Et si nous oublions un champ obligatoire:


[
   {
      "keyword": "required",
      "dataPath": "",
      "schemaPath": "#/required",
      "params": {
         "missingProperty": "lastName"
      },
      "message": "should have required property 'lastName'"
   }
]

Bref, c'est un outils qui est très intéressant car nous pouvons ainsi permettre de valider à n'importe quel moment nos données un peu critiques qui transitent dans nos applications Web ou NodeJs.

Commentaires

Posts les plus consultés de ce blog

ISO: liens & outils utiles

NodeJs et SSL: une petite analyse

Créer sa commande slack en quelques minutes