Aller au contenu principal
CuteJSON
↑↓ Naviguer Enter Selectionner Esc Fermer

Types de données JSON expliqués, avec les cas limites qui font planter les analyseurs

Publie 4 min de lecture Par Akash Kinkar Pandey

JSON possède exactement six types de valeur : chaîne, nombre, booléen, nul, tableau et objet. Rien dans la spécification n’en ajoute un septième. Cette courte liste est facile à énoncer et étonnamment facile à se tromper en pratique, surtout aux limites que chaque type possède et que les types natifs d’un langage ne partagent pas.

Chaine

Du texte entre guillemets doubles, jamais de guillemets simples. 'hello' n’est pas du JSON valide, seul "hello" l’est. Quelques caractères nécessitent un échappement dans une chaîne : le guillemet lui-même (\"), un antislash (\\), et les caractères de contrôle \n, \r, \t, \b et \f. Tout le reste, y compris la plupart du texte Unicode, peut être placé sans échappement tant que le fichier est lui-même en UTF-8 valide. JSON Escape and Unescape gère la conversion dans les deux sens et indique exactement quel caractère a cassé une séquence d’échappement mal formée, plutôt qu’une erreur d’analyse générique.

Nombre

Un seul type numérique, pas de types entier et flottant séparés comme dans certains langages. Un nombre JSON est une suite de chiffres, un point décimal optionnel, et un exposant optionnel : 42, -3.14, 2.5e10. Pas d’hexadécimal, pas de Infinity, pas de NaN, et pas de zéro initial devant un chiffre différent de zéro (0123 est invalide, 0.123 est correct). La limite la plus délicate ici : le type Number de JavaScript est un flottant 64 bits, qui ne peut pas représenter exactement chaque entier au-delà d’environ 2^53 (environ neuf mille milliards). Analyser un document JSON contenant un ID de base de données 64 bits ou un Snowflake ID avec JSON.parse dans la console d’un navigateur peut faire revenir les derniers chiffres arrondis, sans prévenir. Le JSON Formatter de ce site est construit sur un flux de tokens plutôt que sur JSON.parse spécifiquement pour qu’un entier de vingt chiffres survive un aller-retour sans arrondi, et signale les nombres qu’il n’a pas pu représenter en sécurité plutôt que d’arrondir sans le dire.

Booleen

Exactement deux valeurs littérales, en minuscules, sans guillemets : true et false. "true" est une chaîne, pas un booléen, et une source courante de bugs lorsqu’un champ qui devrait être booléen est sérialisé comme texte quelque part en amont.

Nul

Une valeur littérale, en minuscule, sans guillemets : null. Il représente l’absence délibérée d’une valeur, ce qui est différent d’une clé qui est complètement absente. {"middleName": null} signifie “cette personne n’a pas de deuxième nom, et nous avons vérifié.” Un document sans la clé middleName du tout ne dit rien sur le fait qu’il en existe une. Les API qui confondent les deux (en utilisant une clé manquante et une valeur nulle de façon interchangeable) rendent cette distinction impossible à récupérer côté récepteur.

Tableau

Une liste ordonnée, [ ], séparée par des virgules, avec des éléments de tout type y compris des types mélangés dans le même tableau : [1, "two", true, null] est du JSON valide même si ce serait un choix de schéma étrange. L’ordre est garanti et important ; deux tableaux avec les mêmes éléments dans un ordre différent sont des valeurs différentes.

Objet

Un ensemble non ordonné de paires clé-valeur, { }, où les clés sont toujours des chaînes (même une clé en apparence numérique comme "2" est une chaîne, pas un nombre), les valeurs pouvant être de tout type. Deux clés avec le même nom dans un objet ne sont pas interdites par la grammaire, bien que la spécification qualifie le comportement de “non recommandé” et laisse la suite à l’analyseur ; la plupart des implémentations, y compris JSON.parse, gardent silencieusement la dernière et écartent les précédentes. Le JSON Validator signale une clé en double comme un avertissement plutôt que de laisser passer un document en contenant silencieusement, car la question de quelle valeur survit est le genre de chose qui devrait être une décision explicite.

Ce qu’aucun des six types ne peut contenir

Pas de type date : un horodatage est une chaîne, presque toujours au format ISO 8601 ("2026-08-24T10:00:00Z"), par convention plutôt que par quelque chose qu’impose JSON lui-même. Pas de undefined : une clé qui serait undefined en JavaScript est omise de l’objet plutôt qu’écrite avec cette valeur, puisque JSON n’a aucun littéral pour cela. Pas de fonctions, pas de Map ni de Set, pas de commentaires n’importe où dans le document. Un format qui a besoin de tout cela (des commentaires en ligne dans une configuration, par exemple) choisit volontairement un format différent, pas une extension de JSON ; consultez JSON vs YAML pour le compromis que le support des commentaires et quelques autres commodités impliquent.

L’essayer

Collez n’importe quel document dans le JSON Viewer et chaque valeur reçoit sa propre couleur et son propre badge dans l’arbre, ce qui est un moyen rapide de voir exactement comment un document est typé sans lire le texte brut caractère par caractère. Pour connaître les règles de syntaxe en un coup d’œil, consultez la JSON Cheat Sheet.

Retour aux articles