Formateur et validateur JSON

Formatez, validez et inspectez JSON – avec une erreur qui pointe vers le caractère.

Sortie
{
  "name": "jaguar",
  "speed_kph": 80,
  "habitats": [
    "rainforest",
    "wetland"
  ],
  "conservation": {
    "status": "Near Threatened",
    "assessed": 2016
  },
  "nocturnal": null
}

JSON valide

Taille
145 B
Minifié
145 B
Économisé
0%
Clés
7
Objets
2
Profondeur maximale
3

Les quatre erreurs

Presque tous les documents rejetés le sont pour l’une des mêmes quelques raisons, et toutes les quatre sont des choses que JavaScript aurait acceptées. Voilà le piège : le JSON ressemble à un littéral d’objet JavaScript, et c’en est un sous-ensemble bien plus strict.

ÉcritProblèmeCorrect
{"a": 1,}Virgule en trop{"a": 1}
{'a': 1}Guillemets simples{"a": 1}
{a: 1}Clé sans guillemets{"a": 1}
{"a": 1} // noteCommentaireSupprimez-le

Deux autres pièges, moins fréquents mais plus difficiles à repérer. NaN, Infinity et undefined sont des valeurs JavaScript valides et aucune n’est une valeur JSON : le remplaçant, c’est null ou une chaîne. Et un vrai saut de ligne à l’intérieur d’une chaîne est invalide ; il faut les deux caractères \n.

Comment ce validateur signale les erreurs

Cela mérite une explication, car c’est la raison de préférer un formateur à un autre. Le JSON.parse du navigateur sert pour le cas où tout va bien, mais pas pour décrire les échecs : le format de ses messages est un détail d’implémentation qui a changé deux fois dans les versions récentes de V8. Le même document cassé donne « Unexpected end of JSON input » sur une version de Node et « Expected ‘,’ or ‘}’ after property value at position 6 » sur une autre, et parfois aucune position du tout.

Aussi, quand l’analyse échoue, cette page parcourt elle-même la grammaire et indique la ligne, la colonne et le caractère où elle s’est arrêtée, avec un accent circonflexe en dessous. Le message que vous obtenez ne dépend pas du navigateur dont vous vous servez.

Le problème de précision dont personne ne vous prévient

Celui-là provoque de vrais bugs et n’est presque jamais mentionné. Les nombres JSON deviennent des nombres JavaScript, et les nombres JavaScript sont des doubles IEEE 754. Les entiers au-delà de 2⁵³ — environ 9,007 billiards — ne peuvent pas être représentés exactement.

Un identifiant à 19 chiffres comme en produisent Twitter, Discord et la plupart des schémas d’identifiants de type Snowflake reviendra modifié, en silence, sans la moindre erreur nulle part. Collez {"id": 9007199254740993} dans le formateur ci-dessus et regardez le dernier chiffre bouger.

Le correctif se situe du côté de l’émetteur : envoyez les identifiants 64 bits sous forme de chaînes. Toutes les API qui s’y sont brûlées le font désormais.

Quand se tourner vers autre chose

Cette page sert à lire et à réparer un document que vous avez sous les yeux. Deux tâches voisines pour lesquelles ce n’est pas le bon outil :

  • Interroger et transformer. jq en ligne de commande, qui travaille en flux plutôt que de tout charger en mémoire — la bonne réponse au-delà de quelques mégaoctets.
  • Imposer une forme. C’est le rôle de JSON Schema, et valider la structure est une autre question que valider la syntaxe. Un document peut être parfaitement bien formé et ne comporter aucun des champs qu’exige votre API.

À voir aussi

Si le JSON vous est arrivé encodé en Base64, décodez-le d’abord. S’il provient d’un jeton, le décodeur de JWT en découpe et en analyse les deux segments pour vous. Et s’il part dans une URL, l’encodeur d’URL vous montre laquelle des trois règles d’échappement vous voulez.

Questions sur le JSON

Pourquoi mon JSON échoue-t-il alors qu'il semble correct ?

Quatre causes expliquent la quasi-totalité de ce problème. Une virgule finale avant un crochet fermant, ce que JavaScript accepte et non JSON. Des guillemets simples au lieu de guillemets doubles. Commentaires, pour lesquels JSON n'a aucune syntaxe. Et les clés non citées : {name : "x"} est un JavaScript valide et un JSON non valide. Le validateur ci-dessus nomme lesquels d'entre eux ont été trouvés plutôt que de reformuler l'erreur de l'analyseur.

Est-il sécuritaire de coller des données de production ici ?

Dans cette page, oui – il est analysé dans votre navigateur et aucune requête ne pourrait le transporter. Vous pouvez le confirmer en regardant l'onglet Réseau pendant que vous tapez. L'habitude générale mérite cependant d'être conservée : le débogage des personnes JSON est généralement une véritable réponse API contenant de vrais enregistrements de clients, et de nombreux formateurs en ligne la publient sur un serveur pour effectuer le travail. Vérifiez avant de coller, sur n'importe quel outil.

JSON peut-il avoir des commentaires ?

Non. Douglas Crockford les a délibérément supprimés, parce que des gens avaient commencé à y insérer des directives d'analyse. Si vous avez besoin de commentaires dans un fichier de configuration, les réponses habituelles sont JSON5 ou JSONC (ce que VS Code utilise), ou une convention — une clé "_comment" que les consommateurs ignorent. Aucun d’entre eux n’est JSON, donc un analyseur strict les rejettera toujours.

À quoi sert « Trier les clés » et pourquoi le voudrais-je ?

Il réorganise les clés de chaque objet par ordre alphabétique et récursif. Les objets JSON ne sont pas classés par spécification, donc deux documents qui diffèrent uniquement par l'ordre des clés sont équivalents, mais une différence de texte montre chaque ligne comme modifiée. Trier les deux avant de comparer réduit cela aux différences qui comptent réellement.

Y a-t-il une limite de taille ?

Uniquement celui de votre navigateur. L'analyse s'effectue dans la page, donc quelques mégaoctets suffisent sur un ordinateur de bureau et permettront à un téléphone plus ancien de fonctionner. Les documents très volumineux sont mieux gérés avec jq sur la ligne de commande, qui diffuse plutôt que de conserver l'intégralité de l'arborescence en mémoire.

Pourquoi mon grand entier revient-il erroné ?

Parce que les nombres JSON deviennent des nombres JavaScript, qui sont des doubles IEEE 754, et ceux-ci perdent en précision au-dessus de 2⁵³, soit environ 9,007 quadrillions. Un identifiant de style Twitter à 19 chiffres ou un bigint de base de données reviendra subtilement modifié. Il ne s'agit pas d'un bug du formateur ; c'est pourquoi les API qui utilisent des identifiants 64 bits les envoient sous forme de chaînes.

Dernière vérification . Vous avez repéré quelque chose de dépassé ? Dites-le-nous.