ToolHub
View All Posts

Guide de validation par JSON Schema : valider vos structures de données

Chaque application qui reçoit des données d'une source externe est confrontée au même problème fondamental : puis-je faire confiance à ces données ? Qu'il s'agisse de corps de requêtes API, de fichiers de configuration, de messages de file d'attente ou d'importations de données, les données non fiables doivent être validées avant d'entrer dans le système. JSON Schema fournit un moyen standardisé et indépendant du langage de définir à quoi ressemblent les données valides et de vérifier si les données entrantes correspondent à cette définition. Ce guide couvre tout, de l'écriture de votre premier Schema aux modèles avancés de validation complexe, avec des exemples pratiques que vous pouvez appliquer immédiatement.

Qu'est-ce que JSON Schema ?

JSON Schema est un document JSON qui décrit la structure et les contraintes d'autres documents JSON. C'est un vocabulaire qui vous permet d'annoter et de valider des données JSON, standardisé par l'Internet Engineering Task Force (IETF). JSON Schema définit des règles sur les champs qui doivent être présents, leurs types, les valeurs acceptables et la façon dont les objets et tableaux doivent être structurés.

Pensez à JSON Schema comme un contrat pour vos données. Tout comme un schéma de base de données définit les colonnes, types et contraintes d'une table, JSON Schema définit les propriétés, types et contraintes d'un document JSON. Toute donnée JSON satisfaisant toutes les contraintes du Schema est appelée une instance valide, et toute donnée enfreignant une contrainte est invalide.

Ce que JSON Schema n'est pas

Versions de JSON Schema

JSON Schema a évolué à travers plusieurs drafts, chacun ajoutant des fonctionnalités et affinant le vocabulaire. Comprendre ces versions vous aide à choisir la bonne version pour votre projet et à éviter les problèmes de compatibilité.

VersionURI $schemaStatutFonctionnalités principales
Draft 2020-12https://json-schema.org/draft/2020-12/schemaVersion actuelleprefixItems, dynamicRef, support de vocabulaire
Draft 2019-09https://json-schema.org/draft/2019-09/schemaVersion stableunevaluatedProperties, $recursiveRef
Draft 7http://json-schema.org/draft-07/schema#Large supportif/then/else, contentEncoding
Draft 6http://json-schema.org/draft-06/schema#Ancienne versionpropertyNames, contains
Draft 4http://json-schema.org/draft-04/schema#DépréciéPremière version largement adoptée
Recommandation : utilisez Draft 2020-12 pour les nouveaux projets. C'est la dernière version stable, avec le plus de fonctionnalités, prise en charge par les principaux validateurs. Si vous avez besoin d'une compatibilité maximale avec les outils existants, Draft 7 est un choix sûr. Évitez Draft 4 et versions antérieures.

Écrire votre premier Schema

Commençons par un exemple simple : un Schema pour un objet utilisateur contenant un nom, un email et un âge.

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://example.com/schemas/user.json",
    "title": "User",
    "description": "A user account in the system",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The user's full name"
        },
        "email": {
            "type": "string",
            "format": "email",
            "description": "The user's email address"
        },
        "age": {
            "type": "integer",
            "minimum": 0,
            "maximum": 150,
            "description": "The user's age in years"
        }
    },
    "required": ["name", "email"],
    "additionalProperties": false
}

Ce Schema déclare qu'un utilisateur valide doit être un objet, avec name et email comme propriétés obligatoires de type chaîne. La propriété age est facultative, mais si elle est présente, elle doit être un entier entre 0 et 150. La contrainte additionalProperties: false empêche toute propriété non définie dans le Schema, ce qui permet de détecter les fautes de frappe et les champs inattendus.

Référence des mots-clés principaux

JSON Schema fournit un riche vocabulaire de mots-clés pour définir des contraintes. Voici les mots-clés les plus importants, organisés par catégorie.

Mot-clé type

Mot-cléDescriptionExemple
typeType de données attendu"type": "string" ou "type": ["string", "null"]
enumListe des valeurs autorisées"enum": ["active", "inactive", "pending"]
constDoit être exactement cette valeur"const": "v2"

Contraintes numériques

Mot-cléDescriptionExemple
minimumValeur minimale (incluse)"minimum": 0
exclusiveMinimumValeur minimale (exclusive)"exclusiveMinimum": 0
maximumValeur maximale (incluse)"maximum": 100
exclusiveMaximumValeur maximale (exclusive)"exclusiveMaximum": 100
multipleOfDoit être un multiple de cette valeur"multipleOf": 0.01

Contraintes de chaîne

Mot-cléDescriptionExemple
minLengthLongueur minimale de chaîne"minLength": 1
maxLengthLongueur maximale de chaîne"maxLength": 255
patternExpression régulière que la chaîne doit correspondre"pattern": "^[A-Z]{2}\\d{4}$"
formatFormat sémantique (email, uri, date-time, etc.)"format": "email"

Contraintes d'objet

Mot-cléDescriptionExemple
propertiesSchema pour chaque propriété connue"properties": {"name": {"type": "string"}}
requiredListe des propriétés obligatoires"required": ["name", "email"]
additionalPropertiesSi les propriétés supplémentaires sont autorisées"additionalProperties": false
minPropertiesNombre minimum de propriétés"minProperties": 1
maxPropertiesNombre maximum de propriétés"maxProperties": 10
patternPropertiesSchema des propriétés correspondant à une expression régulière"patternProperties": {"^S_": {"type": "string"}}

Contraintes de tableau

Mot-cléDescriptionExemple
itemsSchema pour tous les éléments du tableau"items": {"type": "string"}
prefixItemsSchema pour les éléments positionnels (Draft 2020-12)"prefixItems": [{"type": "string"}, {"type": "number"}]
minItemsNombre minimum d'éléments"minItems": 1
maxItemsNombre maximum d'éléments"maxItems": 100
uniqueItemsTous les éléments doivent être uniques"uniqueItems": true

Modèles de Schema courants

Les Schémas du monde réel nécessitent souvent des modèles allant au-delà de la simple vérification de type. Voici les modèles les plus couramment utilisés.

Validation conditionnelle avec if/then/else

Utilisez une logique conditionnelle pour appliquer différentes contraintes en fonction de la valeur d'une propriété. Par exemple, un objet de paiement nécessite des champs différents selon la méthode de paiement.

{
    "type": "object",
    "properties": {
        "method": { "enum": ["credit_card", "bank_transfer"] },
        "card_number": { "type": "string" },
        "routing_number": { "type": "string" }
    },
    "required": ["method"],
    "if": {
        "properties": { "method": { "const": "credit_card" } }
    },
    "then": {
        "required": ["card_number"]
    },
    "else": {
        "required": ["routing_number"]
    }
}

Combinaisons avec allOf, anyOf, oneOf

Les mots-clés de combinaison vous permettent de combiner des Schémas de manière puissante :

{
    "oneOf": [
        {
            "type": "object",
            "properties": {
                "type": { "const": "email" },
                "address": { "type": "string", "format": "email" }
            },
            "required": ["type", "address"]
        },
        {
            "type": "object",
            "properties": {
                "type": { "const": "phone" },
                "number": { "type": "string", "pattern": "^\\+?[1-9]\\d{1,14}$" }
            },
            "required": ["type", "number"]
        }
    ]
}

Réutilisation de Schema avec $ref

Le mot-clé $ref vous permet de référencer et de réutiliser des Schémas, éliminant la duplication et maintenant la maintenabilité du Schema. Vous pouvez référencer des Schémas dans le même document ou dans des fichiers externes.

{
    "$id": "https://example.com/schemas/order.json",
    "type": "object",
    "properties": {
        "customer": { "$ref": "#/$defs/address" },
        "shipping": { "$ref": "#/$defs/address" },
        "billing": { "$ref": "#/$defs/address" },
        "items": {
            "type": "array",
            "items": { "$ref": "#/$defs/lineItem" },
            "minItems": 1
        }
    },
    "required": ["customer", "items"],
    "$defs": {
        "address": {
            "type": "object",
            "properties": {
                "street": { "type": "string" },
                "city": { "type": "string" },
                "zip": { "type": "string", "pattern": "^\\d{5}(-\\d{4})?$" },
                "country": { "type": "string", "minLength": 2, "maxLength": 2 }
            },
            "required": ["street", "city", "zip", "country"]
        },
        "lineItem": {
            "type": "object",
            "properties": {
                "product": { "type": "string" },
                "quantity": { "type": "integer", "minimum": 1 },
                "price": { "type": "number", "exclusiveMinimum": 0 }
            },
            "required": ["product", "quantity", "price"]
        }
    }
}

Types nullables

Dans JSON Schema Draft 2020-12, les types nullables sont représentés à l'aide d'un tableau de types incluant « null » :

{
    "type": ["string", "null"],
    "description": "An optional display name, or null if not set"
}

Dans les drafts antérieurs, la spécification OpenAPI utilisait le mot-clé nullable: true. Pour le JSON Schema standard, utilisez toujours l'approche du tableau de types.

Validation de format

Le mot-clé format fournit une validation sémantique au-delà des vérifications structurelles. Il spécifie qu'une chaîne doit correspondre à un format bien connu. Les formats couramment pris en charge incluent :

FormatDescriptionExemple
emailAdresse e-mailuser@example.com
uriURI validehttps://example.com/path
uri-referenceURI ou référence relative/path/to/resource
date-timeDate-heure ISO 86012026-05-19T14:30:00Z
dateDate ISO 86012026-05-19
timeHeure ISO 860114:30:00Z
ipv4Adresse IPv4192.168.1.1
ipv6Adresse IPv6::1
uuidIdentifiant unique universel550e8400-e29b-41d4-a716-446655440000
hostnameNom d'hôte Internetwww.example.com
Important : par défaut, le mot-clé format est une annotation et non une contrainte. Les validateurs peuvent l'ignorer sauf si vous activez explicitement la validation de format. Dans Ajv, passez { strict: true } ou { validateFormats: true } pour appliquer les vérifications de format. Vérifiez toujours que votre validateur applique les contraintes de format.

Validation programmatique des données JSON

La validation par Schema est plus utile lorsqu'elle est intégrée dans le code de l'application. Voici des exemples utilisant des bibliothèques populaires dans différents langages.

JavaScript avec Ajv

Ajv est le validateur JSON Schema le plus utilisé en JavaScript. Il prend en charge toutes les versions de draft et offre d'excellentes performances grâce à la compilation JIT des Schémas.

import Ajv from 'ajv';
import addFormats from 'ajv-formats';

const ajv = new Ajv();
addFormats(ajv);

const schema = {
    type: 'object',
    properties: {
        name: { type: 'string', minLength: 1 },
        email: { type: 'string', format: 'email' },
        age: { type: 'integer', minimum: 0 }
    },
    required: ['name', 'email'],
    additionalProperties: false
};

const validate = ajv.compile(schema);
const valid = validate({ name: 'Alice', email: 'alice@example.com', age: 30 });

if (!valid) {
    console.log(validate.errors);
    // [{ keyword: 'required', params: { missingProperty: 'email' }, ... }]
}

Python avec jsonschema

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string", "minLength": 1},
        "email": {"type": "string", "format": "email"},
        "age": {"type": "integer", "minimum": 0}
    },
    "required": ["name", "email"],
    "additionalProperties": False
}

try:
    validate(instance={"name": "Alice", "email": "alice@example.com"}, schema=schema)
except ValidationError as e:
    print(f"Validation failed: {e.message}")

Validation de données d'API avec JSON Schema

L'une des applications les plus précieuses de JSON Schema est la validation des données de requêtes et de réponses d'API. Cela garantit que votre API reçoit des entrées bien formatées et renvoie des données au format attendu, détectant les erreurs tôt et fournissant des messages d'erreur clairs aux clients.

Middleware Express.js

import Ajv from 'ajv';

const ajv = new Ajv({ allErrors: true });

function validateBody(schema) {
    const validate = ajv.compile(schema);
    return (req, res, next) => {
        if (!validate(req.body)) {
            return res.status(400).json({
                error: 'Validation failed',
                details: validate.errors
            });
        }
        next();
    };
}

app.post('/api/users',
    validateBody({
        type: 'object',
        properties: {
            name: { type: 'string', minLength: 1, maxLength: 100 },
            email: { type: 'string', format: 'email' },
            role: { enum: ['admin', 'editor', 'viewer'] }
        },
        required: ['name', 'email'],
        additionalProperties: false
    }),
    (req, res) => {
        // req.body is guaranteed valid here
        createUser(req.body);
    }
);

OpenAPI vs JSON Schema

OpenAPI (anciennement Swagger) utilise un sous-ensemble de JSON Schema pour définir les Schémas de requêtes et de réponses d'API. Si vous utilisez déjà OpenAPI, vous pouvez extraire les Schémas de la spécification d'API et les utiliser pour la validation à l'exécution. Des outils comme openapi-schema-validator et express-openapi-validator peuvent automatiser ce processus, garantissant que votre documentation d'API et votre logique de validation restent toujours synchronisées.

Meilleures pratiques

Besoin de valider des données JSON avec un Schema ? Essayez notre validateur JSON Schema en ligne gratuit. Collez votre Schema et vos données pour obtenir des résultats de validation instantanés avec des messages d'erreur détaillés.

Validateur JSON SchemaOutil de formatage JSON

Questions fréquentes

Qu'est-ce que JSON Schema ?

JSON Schema est un document JSON qui décrit la structure et les contraintes d'autres documents JSON. Il vous permet de définir les champs obligatoires, les types de données attendus, les plages de valeurs, les motifs de chaîne et la structure des objets imbriqués. Vous pouvez l'utiliser pour valider les données entrantes, générer de la documentation et créer automatiquement des interfaces de formulaires.

Quelle version de JSON Schema dois-je utiliser ?

Pour les nouveaux projets, utilisez JSON Schema Draft 2020-12. C'est la dernière version stable, prise en charge par les principaux validateurs comme Ajv. Si vous avez besoin de compatibilité avec des outils plus anciens, Draft 7 est également largement pris en charge. Évitez Draft 4 et versions antérieures car elles utilisent des mots-clés obsolètes et manquent de fonctionnalités modernes.

Quelle est la différence entre JSON Schema et les interfaces TypeScript ?

Les interfaces TypeScript ne fournissent une vérification de type qu'à la compilation dans le code TypeScript. JSON Schema fournit une validation à l'exécution inter-langages qui peut valider des données de n'importe quelle source (requêtes API, fichiers, bases de données). Utilisez TypeScript pour la sécurité au développement, et JSON Schema pour la validation des données à l'exécution aux frontières du système.

JSON Schema peut-il valider des corps de requête d'API ?

Oui, JSON Schema est largement utilisé pour la validation des requêtes et réponses d'API. Des frameworks comme Express (avec express-json-validator), FastAPI et Spring Boot prennent en charge nativement ou via middleware la validation par JSON Schema. Valider les corps de requête avec un Schema garantit que les données entrantes ont la bonne structure avant que l'application ne les traite.

Quels sont les mots-clés JSON Schema les plus importants ?

Les mots-clés les plus critiques sont : type (type de données), properties (champs d'objet), required (champs obligatoires), items (Schema des éléments de tableau), minimum/maximum (limites numériques), minLength/maxLength (limites de chaîne), pattern (expression régulière de chaîne), enum (valeurs autorisées) et $ref (référence pour réutiliser des Schémas). Ces mots-clés couvrent la grande majorité des besoins de validation.