mygems

Corriger un JSON invalide : toutes les erreurs courantes expliquées

Unexpected token, virgule finale, guillemets simples, commentaire interdit. Ce que signifie chaque erreur JSON, comment trouver la ligne et la corriger.

Par mygems ·

Le JSON est strict d'une façon qui paraît mesquine tant qu'on n'en connaît pas les règles. Pas de virgule finale. Uniquement des guillemets doubles. Pas de commentaires. Les clés doivent être entre guillemets. Enfreignez-en une, n'importe où, et le document entier est rejeté avec un message qui pointe une position de caractère et dit rarement ce qui ne va pas.

Cette page relie les messages d'erreur à leurs causes, puis les causes à leurs corrections.

La réponse rapide

  1. Trouvez la position. Chaque parseur indique une ligne et une colonne, ou un décalage en caractères. Allez-y : l'erreur est à cet endroit ou juste avant.
  2. Cherchez les cinq suspects habituels : une virgule finale, des guillemets simples, une clé sans guillemets, un commentaire, ou une virgule manquante entre deux éléments.
  3. Si l'erreur est à la position 0, ou ligne 1, colonne 1, le problème n'est pas le JSON. Vous avez reçu autre chose : une page d'erreur HTML, une réponse vide ou une marque d'ordre des octets (BOM).

Pour obtenir un emplacement précis sur n'importe quelle machine :

python3 -m json.tool broken.json
jq . broken.json

Lire le message d'erreur

La même faute s'affiche différemment selon le langage. Trouvez le vôtre, puis la cause :

Message (abrégé)Où vous le verrezCause habituelle
Unexpected token '<', "<!DOCTYPE"... is not valid JSONJavaScriptVous avez reçu une page HTML, pas du JSON. Voir plus bas
Unexpected end of JSON inputJavaScriptRéponse vide, ou fichier tronqué
Expected double-quoted property nameJavaScriptVirgule finale avant }, ou clé sans guillemets ou avec guillemets simples
Unexpected non-whitespace character after JSONJavaScriptDeux documents collés, ou du texte parasite après l'accolade fermante
Bad control character in string literalJavaScriptUne tabulation ou un saut de ligne brut dans une chaîne
Expecting value: line 1 column 1 (char 0)PythonEntrée vide, ou pas du JSON du tout
Expecting property name enclosed in double quotesPythonVirgule finale, guillemets simples ou clé sans guillemets
Expecting ',' delimiterPythonUne virgule manquante entre deux éléments ou membres
Extra dataPythonPlus d'un document dans le fichier (souvent du NDJSON)
Invalid control characterPythonUne tabulation ou un saut de ligne brut dans une chaîne
Unexpected UTF-8 BOMPythonMarque d'ordre des octets invisible au début du fichier

Les causes, une par une

Virgule finale

{ "name": "Ada", "role": "admin", }

Autorisée dans le code JavaScript, interdite en JSON. Le parseur arrive à } alors qu'il attend une autre clé. Supprimez la dernière virgule. Les fichiers de configuration modifiés à la main et le code qui construit du JSON par concaténation de chaînes en sont les sources habituelles.

Guillemets simples

{ 'name': 'Ada' }

Les chaînes JSON utilisent toujours des guillemets doubles. Cela vient souvent d'un dict Python affiché avec print() au lieu de json.dumps(). La vraie correction se trouve dans le code qui l'a produit : sérialisez avec une bibliothèque JSON, pas avec du formatage de chaînes.

Clés sans guillemets

{ name: "Ada" }

Du JavaScript valide, du JSON invalide. Mettez chaque clé entre guillemets.

Commentaires

{ "port": 8080 // default }

Le JSON n'a pas de commentaires. Mais prudence avant de « corriger » : certains fichiers sont censés en avoir. tsconfig.json, le settings.json de VS Code et beaucoup d'autres fichiers de configuration sont du JSONC (JSON avec commentaires) ou du JSON5, et les outils qui les lisent acceptent les commentaires. Si votre fichier en fait partie, le problème vient du parseur strict auquel vous le donnez, pas du fichier.

Une virgule manquante

{ "a": 1 "b": 2 }

Le parseur la signale à "b", c'est-à-dire après la faute. Quand une erreur pointe une clé parfaitement correcte, regardez la fin de la ligne précédente.

Des valeurs que le JSON ne connaît pas

NaN, Infinity, undefined et les nombres avec zéros en tête comme 007 sont tous invalides. Tout comme un nombre hexadécimal, 0xFF. Utilisez null, une chaîne ou un simple nombre décimal, selon ce qu'attend le lecteur.

Sauts de ligne et tabulations bruts dans une chaîne

Dans une chaîne, les sauts de ligne doivent être échappés en \n et les tabulations en \t. Un vrai retour à la ligne entre guillemets est invalide. Cela arrive souvent quand on colle à la main une valeur multiligne dans un fichier JSON.

Antislashs

Un chemin Windows comme "C:\new\folder" casse, car \n et \f sont des séquences d'échappement. Doublez chaque antislash, "C:\\new\\folder", ou utilisez des barres obliques.

Guillemets typographiques

“name” ressemble à une chaîne, mais n'en est pas une : ce sont des guillemets typographiques, pas ". Ils viennent d'un JSON copié depuis un document, une messagerie ou une diapositive, ou d'une saisie sur iPhone ou iPad, où la ponctuation intelligente remplace les guillemets droits pendant la frappe. Désactivez-la dans Réglages → Général → Clavier avant de modifier du JSON sur iOS.

Erreurs « position 0 » : ce n'est pas du JSON

Quand l'erreur est sur le tout premier caractère, c'est le contenu qui est faux, pas la syntaxe.

  • < à la position 0 signifie que vous avez analysé du HTML. Le serveur a renvoyé une page d'erreur, une page de connexion ou une 404, et votre code a essayé de la lire comme du JSON. Journalisez la réponse brute et le code de statut avant d'analyser.
  • Une entrée vide signifie que la réponse n'avait pas de corps, souvent un 204 No Content ou une requête qui a échoué avant que le serveur ne réponde.
  • Un caractère invisible au début est généralement une marque d'ordre des octets UTF-8 ajoutée par un éditeur Windows. En Python, ouvrez le fichier avec encoding="utf-8-sig" ; ailleurs, réenregistrez-le en UTF-8 sans BOM.

Le NDJSON n'est pas du JSON cassé

Un fichier avec un objet JSON par ligne (.jsonl, .ndjson ou sortie de journal) échoue avec « Extra data » ou « Unexpected non-whitespace » au début de la ligne deux. Chaque ligne est valide seule. Analysez-la ligne par ligne, ou laissez un outil qui comprend le format s'en charger : jq -c . file.jsonl lit chaque ligne.

Réparer automatiquement

Pour les étourderies courantes (virgules finales, guillemets simples, clés sans guillemets, commentaires), la réparation automatique est sûre, car il n'y a qu'une interprétation raisonnable. Voici des outils qui le font :

  • jsonrepair, une bibliothèque JavaScript et un outil en ligne de commande.
  • La plupart des éditeurs de code, via une extension JSON5 ou « fix JSON ».
  • Une application d'édition JSON qui valide pendant la saisie.

La réparation automatique n'est pas sûre pour un fichier tronqué. Un outil de réparation fermera les crochets ouverts et vous rendra un document valide auquel il manque des données. Récupérez-le ou exportez-le de nouveau.

Sur iPhone et iPad, Smart Json affiche l'erreur en langage clair, avec sa ligne et sa colonne. Go y place le curseur, et Fix répare les commentaires, les virgules finales, les guillemets simples et les clés sans guillemets d'une seule touche.

Un document JSON minifié dans l'éditeur avec une bannière indiquant Expected a quoted key but found a stray character, ligne 1, colonne 2, avec les boutons Go et Fix
L'erreur, son emplacement et une correction
JSON Editor: Smart JsoniPhone et iPad

Nomme une erreur JSON en termes clairs avec sa ligne et sa colonne, y saute, et répare les commentaires, les virgules finales, les guillemets simples et les clés sans guillemets d'une seule touche.

Ce que ça fait

Éviter le problème dès le départ

Presque tous les fichiers JSON invalides ont été écrits à la main ou assemblés par concaténation de chaînes. Générez le JSON avec un sérialiseur (json.dumps, JSON.stringify, JSONEncoder), et validez les fichiers modifiés à la main avant de les commiter. Un hook de pre-commit qui exécute jq . file.json > /dev/null attrape tout ce qui précède avant que quelqu'un d'autre ne le voie.

Questions

Que signifie « Unexpected token < in JSON at position 0 » ?
Vous avez analysé du HTML, pas du JSON. Le serveur a renvoyé une page d'erreur, une page de connexion ou une 404, et votre code a essayé de la lire comme du JSON. Journalisez la réponse brute et son code de statut avant d'appeler le parseur.
Les virgules finales sont-elles autorisées en JSON ?
Non. Une virgule après le dernier élément d'un objet ou d'un tableau rend le document invalide, même si le code JavaScript l'autorise. Supprimez la dernière virgule. Les formats JSON5 et JSONC l'autorisent, mais pas les parseurs JSON standard.
Le JSON peut-il contenir des commentaires ?
Le JSON standard, non. Certains formats de configuration qui en dérivent, comme JSONC (utilisé par VS Code et tsconfig.json) et JSON5, autorisent les commentaires, et les outils qui lisent ces fichiers les acceptent. Un parseur JSON strict les rejettera.
Comment trouver l'endroit où mon JSON est invalide ?
Passez-le dans un validateur qui indique un emplacement : python3 -m json.tool file.json ou jq . file.json en ligne de commande, ou un éditeur JSON qui souligne l'erreur. La faute se trouve à la position indiquée ou juste avant, généralement à la fin de la ligne précédente.
Pourquoi mon JSON est-il invalide alors qu'il semble correct ?
Cherchez les caractères qui ont l'air corrects mais ne le sont pas : guillemets typographiques au lieu de guillemets droits (fréquent après une copie depuis un document ou une saisie sur iPhone), marque d'ordre des octets invisible au début du fichier, ou tabulation brute dans une chaîne.
Peut-on réparer automatiquement un JSON invalide ?
Les étourderies courantes, oui : virgules finales, guillemets simples, clés sans guillemets et commentaires ont chacun un sens évident, et des outils comme jsonrepair les corrigent sans risque. Un fichier tronqué ne peut pas l'être sans risque, car un outil de réparation fermera les crochets et perdra silencieusement les données manquantes.

mygems — Développe Smart Json, dont le parseur écrit à la main nomme chacune de ces erreurs avec sa ligne et sa colonne, et répare les plus courantes.