Le JSON (JavaScript Object Notation) est un format texte léger pour stocker et échanger des données structurées. Il se compose d'objets de paires clé/valeur, de tableaux ordonnés et d'une poignée de types de valeurs : chaînes, nombres, true, false et null. C'est le format par défaut des API web et de nombreux fichiers de configuration, car il est facile à lire pour les humains et simple à analyser pour tous les langages de programmation. Le JSON est strict : les clés et les chaînes exigent des guillemets doubles, et les virgules finales comme les commentaires sont interdits.
- Le JSON compte exactement six types de valeurs : objet, tableau, chaîne, nombre, booléen (
true/false) etnull. - Les clés doivent être des chaînes entre guillemets doubles ; les guillemets simples ne sont jamais valides.
- Pas de virgule finale, pas de commentaires, pas de
undefined, deNaNni d'Infinity. - La plupart des erreurs « JSON invalide » viennent d'une virgule manquante ou en trop, d'un mauvais guillemet ou d'un caractère non échappé dans une chaîne.
- Validez d'abord la syntaxe avec un analyseur strict, puis la structure avec JSON Schema si vous en avez besoin.
À quoi ressemble un fichier JSON
Le JSON est né de la syntaxe que JavaScript utilise pour les littéraux d'objet, mais il est indépendant de tout langage. Il est défini dans la RFC 8259 et dans la norme ECMA-404, et le résumé d'une page de json.org décrit toute la grammaire. Un document typique ressemble à ceci :
{
"id": 1042,
"name": "Ada Lovelace",
"email": "ada@example.com",
"active": true,
"score": 98.5,
"manager": null,
"roles": ["admin", "editor"],
"address": {
"city": "London",
"postcode": "N1 9GU"
}
}
Les espaces entre les éléments (espaces, tabulations et sauts de ligne) sont ignorés : les mêmes données peuvent donc tenir sur une seule ligne ou être aérées par une indentation. Le niveau supérieur d'un document JSON peut être n'importe quelle valeur, même si les API utilisent presque toujours un objet ou un tableau.
Les types de données JSON
| Type | Exemple | Règles |
|---|---|---|
| Objet | {"a": 1, "b": 2} | Ensemble non ordonné de paires clé/valeur entre accolades. Les clés sont des chaînes ; deux-points entre la clé et la valeur ; virgules entre les paires. |
| Tableau | [1, "two", false] | Liste ordonnée de valeurs entre crochets, séparées par des virgules. Les valeurs peuvent être de types différents. |
| Chaîne | "caf\u00e9 \"quoted\"" | Guillemets doubles uniquement. Échappements avec barre oblique inverse : \" \\ \/ \b \f \n \r \t et \uXXXX. Les sauts de ligne et tabulations bruts sont interdits dans les chaînes. |
| Nombre | -12, 3.14, 6.02e23 | Décimal uniquement. Pas de + initial, pas de zéros en tête (07), pas d'hexadécimal, pas de NaN ni d'Infinity. Le point décimal doit avoir des chiffres de chaque côté. |
| Booléen | true, false | En minuscules, sans guillemets. |
| Null | null | En minuscules, sans guillemets. Représente une valeur vide ou inconnue. |
Il n'existe pas de type date. Les dates s'écrivent généralement sous forme de chaînes au format ISO 8601, comme "2026-10-13T09:30:00Z", ou sous forme de nombres (timestamps Unix) ; notre Convertisseur de timestamp Unix passe de l'un à l'autre.
Nombres et précision
La norme JSON ne limite ni la taille ni la précision des nombres, mais les programmes qui lisent le JSON, eux, les limitent. JavaScript stocke les nombres sous forme de valeurs à virgule flottante sur 64 bits : les entiers supérieurs à 9 007 199 254 740 991 (253 − 1) peuvent donc perdre de la précision sans prévenir. Pour les identifiants très grands, de nombreuses API les envoient sous forme de chaînes, par exemple "id": "1234567890123456789".
Les règles qui piègent le plus souvent
Le JSON ressemble à du JavaScript, aux dictionnaires Python et au YAML, et c'est justement pour cela qu'on écrit du JSON invalide sans le vouloir. Ces règles ne souffrent aucune exception dans le JSON standard :
- Les clés doivent être des chaînes entre guillemets doubles.
{name: "Ada"}est du JavaScript valide mais du JSON invalide ; écrivez{"name": "Ada"}. - Uniquement des guillemets doubles.
'Ada'n'est pas une chaîne JSON. - Pas de virgule finale.
[1, 2, 3,]et{"a": 1,}sont invalides. - Pas de commentaires. Ni
// ...ni/* ... */ne sont autorisés. - Les valeurs littérales sont en minuscules.
True,FALSEetNone(l'écriture de Python) sont invalides ; utiliseztrue,falseetnull. - Pas de
undefined, de fonctions ni de nombres spéciaux. Ils existent en JavaScript mais n'ont aucun équivalent en JSON. - Les clés devraient être uniques. La norme indique que les noms d'un objet devraient être uniques ; en cas de doublons, les analyseurs se comportent différemment, et beaucoup ne gardent silencieusement que le dernier.
Certains outils acceptent des variantes assouplies. Des fichiers comme le settings.json de VS Code et le tsconfig.json de TypeScript sont lus par des analyseurs qui autorisent les commentaires (souvent appelés JSONC), et le JSON5 autorise les commentaires, les guillemets simples et les virgules finales. Ce sont des formats distincts : un analyseur JSON standard, y compris celui qu'utilisent votre client d'API ou votre serveur, les rejettera.
Erreurs JSON courantes et comment les corriger
Le libellé des erreurs varie selon les analyseurs. Le tableau montre le type de message que vous verrez avec le module json de Python ou le JSON.parse d'un navigateur, ce qu'il signifie généralement, et la correction. La position indiquée pointe souvent juste après la vraie erreur : regardez donc aussi le caractère qui la précède.
| Problème | Message d'erreur typique | Correction |
|---|---|---|
Virgule finale : {"a": 1,} | "Expecting property name enclosed in double quotes" ou "Unexpected token }" | Supprimez la virgule après le dernier élément de l'objet ou du tableau. |
Clé sans guillemets ou entre guillemets simples : {a: 1}, {'a': 1} | "Expecting property name enclosed in double quotes" ou "Expected double-quoted property name" | Mettez chaque clé entre guillemets doubles. |
Valeur de chaîne entre guillemets simples : {"a": 'x'} | "Expecting value" ou "Unexpected token '" | Utilisez des guillemets doubles et échappez ceux qui se trouvent à l'intérieur sous la forme \". |
| Virgule manquante entre deux éléments | "Expecting ',' delimiter" ou "Expected ',' or '}' after property value" | Ajoutez une virgule entre les deux valeurs ou paires, à la ligne indiquée. |
| Commentaire dans le fichier | "Expecting value" ou "Unexpected token /" | Supprimez le commentaire, ou placez la note dans un champ de données comme "_comment". |
Littéraux Python ou JavaScript : True, None, undefined, NaN | "Expecting value" ou "Unexpected token" | Utilisez true, false ou null ; sérialisez les données avec une vraie bibliothèque JSON plutôt qu'en les affichant avec print. |
| Saut de ligne ou tabulation brut dans une chaîne | "Invalid control character" ou "Bad control character in string literal" | Remplacez-le par \n ou \t. |
Barre oblique inverse non échappée, par exemple un chemin Windows "C:\new" | "Invalid \escape" ou "Bad escaped character" | Doublez les barres obliques inverses : "C:\\new". |
| Crochet ou guillemet fermant manquant | "Unterminated string" ou "Unexpected end of JSON input" | Vérifiez que chaque {, [ et " est fermé ; l'indentation d'un formateur rend le manque évident. |
| Deux documents bout à bout, ou du texte après la fin | "Extra data" ou "Unexpected non-whitespace character after JSON" | Placez les objets multiples dans un tableau, ou traitez l'entrée comme du JSON Lines (un document par ligne). |
| Réponse vide ou page d'erreur HTML analysée comme du JSON | "Expecting value: line 1 column 1" ou "Unexpected token <" | Vérifiez le statut HTTP et le corps de la réponse ; le serveur a renvoyé autre chose que du JSON. |
La dernière ligne est l'une des plus fréquentes en pratique : le code appelle JSON.parse ou response.json() sur une page d'erreur qui commence par <!DOCTYPE html>, et le < est signalé comme un jeton inattendu.
JSON, YAML ou XML : quelles différences ?
| JSON | YAML | XML | |
|---|---|---|---|
| Structure | Accolades et crochets | Indentation | Balises ouvrantes et fermantes |
| Commentaires | Non | Oui (#) | Oui (<!-- -->) |
| Types de données | Chaîne, nombre, booléen, null, objet, tableau | Similaires, plus les dates et d'autres types selon l'analyseur | Tout est du texte, sauf si un schéma attribue des types |
| Attributs et contenu mixte | Non | Non | Oui |
| Verbosité | Compact | Le plus compact à lire | Le plus verbeux |
| Usages typiques | API web, stockage dans le navigateur, manifestes de paquets, journaux | Configuration : Kubernetes, Docker Compose, pipelines CI | Documents, SOAP, RSS et Atom, sitemaps, formats de fichiers bureautiques |
| Principaux pièges | Guillemets et virgules stricts | Sensible aux espaces ; certaines valeurs sans guillemets sont interprétées de façon inattendue | Verbeux ; les espaces de noms et les entités ajoutent de la complexité |
YAML 1.2 a été conçu pour que les documents JSON soient, à de rares cas limites près, aussi des documents YAML valides, ce qui rend la conversion de l'un à l'autre simple. Notre Convertisseur JSON ↔ YAML gère les deux sens, le Formateur et validateur YAML et le Formateur et validateur XML valident les deux autres formats, et le Convertisseur CSV ↔ JSON transforme les exports de tableur en tableaux d'objets.
Mettre en forme ou minifier du JSON
Comme les espaces ne sont pas significatifs, un même JSON peut être mis en forme pour les humains ou pour les machines :
- Le JSON mis en forme (pretty-printed) ajoute des sauts de ligne et une indentation, généralement de deux ou quatre espaces, pour que l'imbrication soit visible. Utilisez-le pour les fichiers de configuration, la documentation et le débogage.
- Le JSON minifié supprime tous les espaces facultatifs pour alléger les données. Utilisez-le pour les données envoyées sur le réseau ou stockées en masse ; la compression HTTP réduit aussi la taille, si bien que le gain est souvent modeste.
{"name":"Ada","roles":["admin","editor"],"active":true}
La plupart des langages savent faire les deux. En JavaScript, JSON.stringify(data, null, 2) met en forme avec une indentation de deux espaces et JSON.stringify(data) minifie. En Python, json.dumps(data, indent=2) met en forme et json.dumps(data, separators=(",", ":")) donne la sortie la plus compacte.
Comment valider du JSON
Valider du JSON comporte deux niveaux : le texte est-il du JSON syntaxiquement valide, et a-t-il la structure que votre application attend ?
- Vérifiez la syntaxe avec un analyseur strict. Collez le texte dans notre Formateur et validateur JSON, qui indique la ligne et la colonne de la première erreur et fonctionne dans votre navigateur. En ligne de commande,
python3 -m json.tool data.jsonoujq . data.jsonaffiche le document formaté ou une erreur. - Corrigez les erreurs une par une. Un analyseur s'arrête au premier problème : relancez-le après chaque correction jusqu'à ce qu'il réussisse.
- Vérifiez la structure. Assurez-vous que les champs obligatoires existent et ont le bon type, soit dans le code, soit avec un validateur JSON Schema.
- Vérifiez l'encodage. Le JSON échangé entre systèmes devrait être en UTF-8. Un fichier enregistré dans un autre encodage peut produire des caractères étranges ou des erreurs avec du texte non anglais.
JSON Schema en bref
JSON Schema est un vocabulaire, écrit en JSON lui-même, qui décrit à quoi ressemble un document valide : quelles propriétés sont obligatoires, de quel type doit être chacune, les valeurs autorisées, les motifs de chaînes, les plages numériques, etc. Il existe des validateurs pour la plupart des langages, et des formats de description d'API comme OpenAPI s'appuient sur JSON Schema pour décrire les corps de requête et de réponse. La spécification est publiée sur json-schema.org. Un petit exemple :
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["id", "email"],
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" },
"roles": { "type": "array", "items": { "type": "string" } }
}
}
Un document sans email, ou dont l'id est une chaîne, serait du JSON valide mais échouerait à ce schéma. Notez que de nombreux validateurs traitent format comme une simple annotation et ne l'appliquent que s'ils sont configurés pour le faire.
Questions fréquentes
Le JSON peut-il contenir des commentaires ?
Non. Le JSON standard n'autorise aucun commentaire, de quelque sorte que ce soit. Certains outils acceptent JSONC ou JSON5, qui en autorisent, mais les fichiers destinés à être lus par d'autres programmes devraient s'en tenir au JSON pur. Si vous avez besoin d'une note, ajoutez un champ comme "_comment".
Pourquoi le JSON n'accepte-t-il pas les virgules finales ?
La grammaire a été volontairement réduite au minimum et ne les prévoit tout simplement pas. De nombreux moteurs JavaScript et d'autres langages acceptent les virgules finales dans leur propre syntaxe, ce qui explique qu'elles se glissent souvent par erreur dans du JSON écrit à la main.
Quelle est la différence entre le JSON et un objet JavaScript ?
Le JSON est un format texte ; un objet JavaScript est une structure de données en mémoire. La syntaxe du JSON est un sous-ensemble plus strict de la syntaxe des littéraux JavaScript. On passe de l'un à l'autre avec JSON.parse et JSON.stringify.
Que signifie « Unexpected token < in JSON at position 0 » ?
Le texte analysé commence par <, ce qui signifie presque toujours que vous avez reçu du HTML, comme une page d'erreur ou de connexion, à la place du JSON. Vérifiez l'URL de la requête, le code de statut HTTP et le corps brut de la réponse.
L'ordre des clés d'un objet JSON est-il conservé ?
La norme considère les objets comme non ordonnés : il ne faut donc pas compter sur l'ordre des clés. En pratique, la plupart des analyseurs modernes conservent l'ordre de lecture, mais l'ordre des tableaux est le seul que le JSON garantisse.
Quelle extension de fichier et quel type MIME utilise le JSON ?
Les fichiers utilisent l'extension .json et le type de média est application/json, tel qu'enregistré dans la RFC 8259.