Aide-mémoire de syntaxe JSON
La syntaxe JSON, telle que la définit la RFC 8259, se réduit à six caractères structurels, quatre caractères d’espacement légaux, deux conteneurs, six types de valeurs et une grammaire stricte pour les chaînes et les nombres. Cet aide-mémoire place chaque règle sur une seule page — y compris les erreurs exactes que les parseurs rejettent, des virgules finales aux littéraux hexadécimaux.
Aide-mémoire de syntaxe JSON en clair
La grammaire JSON complète tient en quelques dizaines de lignes d’ABNF, et presque chaque erreur d’analyse réelle fait partie d’une douzaine de fautes précises. Cette page est la version de référence de ce savoir : chaque section énonce une tranche de la grammaire exactement comme la RFC 8259 la définit, puis montre la règle sous forme de JSON copiable que vous pouvez coller dans un formateur ou un validateur pour le voir passer ou échouer.
Trois documents comptent si vous voulez des sources primaires. La RFC 8259 est la norme internet en vigueur, ECMA-404 est la norme jumelle identique publiée par Ecma International, et la grammaire des nombres à l’intérieur de la RFC 8259 réutilise délibérément la grammaire des nombres de la spécification ECMAScript, extensions octale et hexadécimale retirées. Chaque règle ci-dessous remonte à l’une de ces trois sources — rien ici n’est convention ni folklore.
Les règles sont courtes mais impitoyables : il n’existe pas de JSON tolérant. Un parseur conforme accepte un document en bloc ou le rejette avec une erreur de syntaxe, et les rejets se concentrent autour de la poignée de règles que les développeurs oublient le plus souvent — style de guillemets, virgules finales, commentaires, zéros initiaux. Apprenez celles-ci une fois ci-dessous et la plupart des échecs de validation cessent d’être des mystères.
Les règles s’ancrent le plus vite quand vous les enfreignez exprès, alors gardez le formateur JSON ouvert dans un second onglet et réindentez chaque exemple de cette page au fil de votre lecture.
Quand vous voulez un verdict plutôt qu’un joli formatage, le validateur JSON signale la ligne et la colonne exactes de la première règle qu’un document enfreint.
Les six caractères structurels
Six caractères de ponctuation portent toute la structure du JSON : les accolades { } qui enveloppent les objets, les crochets [ ] qui enveloppent les tableaux, le deux-points : qui sépare une clé de sa valeur, et la virgule , qui sépare les paires dans un objet ou les valeurs dans un tableau. Rien d’autre dans la grammaire ne fait de travail structurel — chaque autre caractère d’un document est soit dans une chaîne, soit l’un des quatre caractères d’espacement. Une virgule est strictement un séparateur : elle peut apparaître entre deux éléments, jamais avant une accolade ou un crochet fermant.
| Caractères | Nom | Rôle dans la grammaire |
|---|---|---|
| { } | Accolades | Ouvrent et ferment un objet — un ensemble de paires clé/valeur |
| [ ] | Crochets | Ouvrent et ferment un tableau — une liste ordonnée de valeurs |
| : | Deux-points | Sépare une clé de sa valeur dans un objet |
| , | Virgule | Sépare des paires ou des éléments de tableau — jamais la dernière chose avant un caractère fermant |
Valide — des virgules uniquement entre les éléments
{"name":"Ada","tags":["math","pioneer"]}Invalide — virgule finale avant un caractère fermant
{"name":"Ada","tags":["math","pioneer"],}L’espacement : exactement quatre caractères
Hors des chaînes, le JSON n’autorise que quatre caractères d’espacement : l’espace (U+0020), la tabulation horizontale (U+0009), le saut de ligne (U+000A) et le retour chariot (U+000D). Tout le reste — tabulation verticale, saut de page, espace insécable, marque d’ordre des octets — est une erreur de syntaxe, même si beaucoup d’éditeurs rendent ces caractères invisibles. Voilà pourquoi un JSON collé depuis un traitement de texte échoue si souvent à la validation : le document semble propre à l’écran et contient des caractères dont la grammaire n’a jamais entendu parler.
L’espacement est aussi ce qui rend le formatage possible. Comme la grammaire ignore ces quatre caractères entre les tokens, un même document peut être une seule longue ligne en transit et un arbre indenté dans votre éditeur, et les deux formes sont sémantiquement identiques — aucun parseur ne peut les distinguer après lecture.
Minifié — aucun espacement optionnel
{"a":1,"b":[2,3]}Formaté — espacement ajouté, données inchangées
{
"a": 1,
"b": [
2,
3
]
}Les chaînes : guillemets doubles et les neuf échappements
Une chaîne JSON est enveloppée de guillemets doubles — jamais de guillemets simples. À l’intérieur, la barre oblique inverse \ introduit un échappement, et la RFC 8259 définit exactement neuf échappements à deux caractères : deux sont obligatoires, \" pour un guillemet double littéral et \\\\ pour une barre oblique inverse littérale, car ces deux caractères termineraient ou corrompraient sinon la chaîne. Six autres sont des raccourcis optionnels — \/ pour la barre oblique et \b \f \n \r \t pour les cinq caractères de contrôle qui apparaissent le plus souvent dans le texte. La neuvième forme est \uXXXX, qui écrit n’importe quel point de code Unicode par son nombre hexadécimal à quatre chiffres.
Chaque caractère hors de l’ensemble d’échappement peut apparaître littéralement en UTF-8, et les deux formes sont équivalentes : un parseur délivre la chaîne identique dans les deux cas. L’échappement est une graphie, pas des données — un point que le guide de l’échappement développe en profondeur.
| Échappement | Produit | Statut selon la RFC 8259 |
|---|---|---|
| \" | guillemet double | Obligatoire — la seule façon de citer dans une chaîne |
| \\ | barre oblique inverse | Obligatoire — la seule façon d’écrire une barre oblique inverse littérale |
| \/ | barre oblique | Raccourci optionnel, légal mais rarement nécessaire |
| \b \f \n \r \t | retour arrière, saut de page, saut de ligne, retour chariot, tabulation | Échappements nommés pour les cinq caractères de contrôle courants |
| \uXXXX | tout point de code, p. ex. \u00e9 pour é | Forme universelle — exactement quatre chiffres hexadécimaux |
Forme échappée dans le fichier
"quote": "she said \"hi\"" "path": "C:\\Users\\ada" "e-acute": "\u00e9"
Ce que restitue un parseur
quote: she said "hi" path: C:\Users\ada e-acute: é
Les nombres : ECMAScript, sans les extensions
Un nombre est un entier ou un décimal en notation simple, avec un exposant optionnel. La RFC 8259 adopte la grammaire des nombres d’ECMAScript et en retire les extensions : pas d’hexadécimal, pas d’octal, pas de zéros initiaux, pas de plus initial, pas de point final isolé. Un exposant utilise e ou E avec un signe optionnel, et le seul signe par lequel un nombre peut commencer est le trait d’union simple. NaN, Infinity et -Infinity ne sont pas du JSON — les langages qui ont de telles constantes écrivent null à leur place, par convention.
La précision est délibérément laissée aux implémentations : la grammaire ne dit rien du nombre de chiffres qu’un parseur doit honorer, si bien que de très longs nombres peuvent arriver silencieusement modifiés. Les producteurs interopérables gardent les entiers dans la plage que la plateforme cible représente exactement — pour les doubles IEEE 754 derrière JavaScript, c’est jusqu’à 2^53 − 1.
| Écrit | Verdict | Pourquoi |
|---|---|---|
| 42, -17, 3.14 | Valide | Formes entières et décimales simples |
| 2.1e10, 5E-3 | Valide | Exposants : e ou E, signe optionnel après |
| 01, -01 | Invalide | Les zéros initiaux sont interdits — écrivez 1 |
| 1., .5, +6 | Invalide | Un point exige des chiffres des deux côtés ; pas de plus initial |
| 0x1F, 1_000 | Invalide | Hexadécimal et séparateurs de chiffres sont des extensions JavaScript |
| NaN, Infinity | Invalide | Hors de la grammaire ; le JSON n’a pas de telles constantes |
| 9007199254740993 | Risqué | S’analyse, mais dépasse la plage d’entiers exacts des doubles IEEE 754 |
Les trois littéraux et les cinq rejets classiques
Trois tokens nus complètent l’ensemble des valeurs : true, false et null. Ils sont en minuscules et sans guillemets — True, FALSE et None sont des erreurs de syntaxe, pas des majuscules créatives. Autour d’eux, la grammaire trace cinq lignes qui expliquent presque chaque document rejeté en conditions réelles :
- Pas de commentaires. La RFC 8259 n’a aucune syntaxe de commentaire ; // ou /* */ où que ce soit est une erreur de syntaxe. Annotez avec une clé voisine comme "_comment" quand le format est sous votre contrôle.
- Pas de virgules finales. [1, 2, 3,] et {"a":1,} sont invalides, si anodins qu’ils paraissent — la virgule est un séparateur, et elle ne peut pas séparer un élément de rien.
- Pas de guillemets simples et pas de clés sans guillemets. {name:'ada'} est un JSON invalide ; {"name":"ada"} est la seule graphie de la grammaire.
- Pas de clés dupliquées — officiellement. La grammaire autorise qu’un nom apparaisse deux fois, mais la RFC 8259 §4 laisse aux implémentations le choix de la valeur gagnante, si bien qu’un document qui repose sur des doublons n’a pas de sens défini.
- N’importe quelle valeur au premier niveau. Depuis la RFC 8259, un document entier peut être une chaîne nue, un nombre, un booléen ou null — la règle de la RFC 4627 restreignant aux objets et aux tableaux a disparu, et "hello" ou 42 sont des documents JSON complets.
L’encodage : UTF-8 et les règles au niveau de l’octet
La RFC 8259 §8.1 fixe l’encodage en octets : le texte JSON échangé entre systèmes qui ne font pas partie d’un écosystème fermé doit être encodé en UTF-8. Il n’existe pas de JSON UTF-16 ou UTF-32 sur le réseau ouvert, et les producteurs ne doivent pas préfixer une marque d’ordre des octets — un parseur peut ignorer un BOM en tête plutôt que de lever une erreur, mais rien de conforme n’en émet. Notez comme les couches se séparent : l’échappement \uXXXX est un choix de notation dans les chaînes individuelles, tandis que l’UTF-8 est une propriété du document entier, et les deux résolvent des problèmes différents.
Cela clôt la grammaire. Le moyen le plus rapide d’ancrer ces règles est de confronter vos propres documents à elles — formatez un vrai payload, enfreignez une règle à la fois, et lisez chaque erreur du validateur. Dix minutes d’échec délibéré enseignent plus qu’une lecture de plus de cette page.
Questions fréquentes
Puis-je coller de vraies données d’API dans les outils liés depuis cette page ?
Oui. Le formateur et le validateur de ce site s’exécutent entièrement dans votre navigateur : votre document est analysé par JavaScript dans l’onglet, et il n’y a aucune étape d’envoi à auditer. Vous pouvez le vérifier vous-même — le panneau Network du navigateur reste silencieux pendant que les outils travaillent, et la Content-Security-Policy du site bloque les connexions sortantes ; même une copie modifiée de la page ne pourrait pas transmettre vos données.
Le JSON autorise-t-il les guillemets simples pour les chaînes ?
Non. La RFC 8259 définit les chaînes comme entre guillemets doubles, pour les clés comme pour les valeurs, et ne donne aux guillemets simples aucun sens — un parseur qui rencontre 'hello' échoue immédiatement, tandis que "hello" est la seule graphie valide. Les outils qui lisent les guillemets simples sans sourciller analysent du JSON5 ou un autre sur-ensemble, pas du JSON, voilà pourquoi leur sortie peut quand même être rejetée par des consommateurs plus stricts.
Qu’est-ce qu’au juste une virgule finale, et pourquoi est-ce une erreur ?
Une question de position, pas de caractère. Une virgule entre deux éléments est un séparateur ; une virgule immédiatement avant } ou ] séparerait un élément de rien, et la grammaire l’interdit. C’est la raison la plus fréquente pour laquelle un fichier édité à la main échoue à la validation, voilà pourquoi les générateurs, les minifieurs et les outils de formatage suppriment toutes les virgules finales pour vous avant d’écrire.
Pourquoi les nombres JSON ne peuvent-ils pas avoir de zéros initiaux comme 007 ?
Les zéros initiaux étaient la façon d’écrire les littéraux octaux (base 8) dans le JavaScript ancien, et la RFC 8259 tire sa grammaire des nombres d’ECMAScript, extensions octale et hexadécimale retirées — 007 est donc rejeté pour qu’une seule graphie signifie une seule valeur. Écrivez 7, et stockez les identifiants tels que les codes postaux en chaînes dès qu’un zéro initial fait partie de la valeur.
Les clés dupliquées dans un objet JSON sont-elles légales ?
La grammaire permet qu’un nom apparaisse deux fois, mais la norme refuse délibérément de définir le résultat : la RFC 8259 note que les implémentations rapportent la dernière valeur, la première valeur ou une erreur. Un document dont le sens dépend des doublons n’est donc pas du JSON interopérable — traitez les doublons comme un bug même quand votre parseur particulier se contente de les accepter en silence.
Jusqu’où un nombre JSON peut-il aller avant que la précision ne casse ?
La grammaire ne fixe aucune limite de chiffres, mais la plupart des parseurs décodent en flottants à double précision IEEE 754, qui ne représentent les entiers exactement que jusqu’à 2^53 − 1. Un identifiant à 17 chiffres comme 9007199254740993 peut arriver silencieusement altéré — la raison classique pour laquelle les SDK des API à identifiants 64 bits demandent de les traiter comme des chaînes plutôt que comme des nombres.
Où puis-je lire les normes citées ici ?
Quels outils liés devriez-vous utiliser ensuite ?
- Formater du JSONIndente, trie les clés et supprime les commentairesOuvrir
- Valider du JSONVérifie la syntaxe avec ligne et colonne exactes, puis répareOuvrir
- Qu’est-ce que le JSONGuide en langage clairOuvrir
- Échappement JSONGuide en langage clairOuvrir
- Minifier du JSONSupprime les espaces et mesure la vraie taille gzipOuvrir
- JSON vs YAMLComparatif point par pointOuvrir