Erreurs d'analyse JSON courantes et comment les corriger
JSON.parse() ne fait pas d'analyse partielle et ne devine pas vos intentions — un seul caractère mal placé dans un document de plusieurs mégaoctets déclenche la même SyntaxError générique qu'un caractère mal placé dans un fichier de configuration de cinq lignes. Ce guide passe en revue les erreurs que vous rencontrerez réellement dans V8 (Node.js et Chrome), ce que chacune veut vraiment dire, et comment choisir entre une correction manuelle et un outil de réparation automatisé.
Pourquoi JSON.parse lève une erreur au lieu de deviner
Les littéraux d'objets JavaScript sont tolérants : clés non citées, virgules finales, chaînes entre apostrophes et même commentaires sont légaux, parce que la source est analysée par le même moteur que tout le reste. JSON n'est pas du JavaScript — c'est une grammaire bien plus petite et plus stricte (RFC 8259), et JSON.parse() applique chaque règle de cette grammaire sans repli. Il n'existe pas de JSON « à peu près correct » ; l'analyseur lit de gauche à droite et s'arrête net au premier jeton qui ne correspond pas à la grammaire à cette position.
C'est un choix de conception délibéré, pas une limitation : un analyseur JSON permissif accepterait silencieusement des documents subtilement différents selon les implémentations — exactement le problème d'interopérabilité que JSON a été inventé pour éviter. Le coût, c'est que les messages d'erreur sont laconiques et positionnels plutôt que sémantiques — l'analyseur vous dit où la grammaire s'est brisée, pas ce que vous vouliez écrire.
Virgules finales
L'erreur JSON la plus courante est une virgule finale héritée de l'édition d'un littéral d'objet JavaScript (où elle est légale) en oubliant qu'elle ne l'est pas en JSON.
{
"name": "Alice",
"roles": ["admin", "editor"],
}V8 rejette ceci à l'accolade fermante, pas à la virgule, car la virgule elle-même est une grammaire valide jusqu'à ce que l'analyseur s'attende à une autre propriété et trouve `}` à la place. Selon votre version de Node/Chrome, vous verrez quelque chose comme `Unexpected token '}', "...editor"],\n}"... is not valid JSON` (V8 récent, avec un extrait) ou l'ancien, plus laconique `Unexpected token } in JSON at position 47`. Dans tous les cas, la correction est la même : supprimez la virgule avant le crochet ou l'accolade fermant.
Apostrophes et clés non citées
JSON exige des guillemets doubles pour chaque chaîne et chaque clé — sans exception. Les chaînes entre apostrophes et les clés nues (non citées) sont extrêmement courantes quand le JSON est tapé à la main ou copié-collé depuis du code JavaScript.
{ 'name': 'Alice' }
{ name: "Alice" }Une apostrophe ouvrante produit quelque chose comme `Unexpected token ''', "{ 'name'"... is not valid JSON`. Une clé non citée est subtilement différente : V8 moderne reconnaît qu'un nom de propriété était attendu et signale `Expected property name or '}' in JSON at position 2`, au lieu d'incriminer directement l'identifiant nu. Dans tous les cas, la correction est mécanique — enveloppez chaque clé et chaque valeur de chaîne de guillemets doubles.
Sauts de ligne et caractères de contrôle non échappés dans les chaînes
Un saut de ligne brut, une tabulation ou tout autre caractère de contrôle (n'importe quoi en dessous de U+0020) à l'intérieur d'une chaîne JSON est illégal — il doit être échappé en `\n`, `\t`, etc. Cela mord le plus souvent quand le JSON est généré en concaténant naïvement une valeur multi-lignes (un message de log, un extrait de code, un commentaire d'utilisateur) dans un littéral de chaîne sans l'échapper au préalable.
{
"message": "line one
line two"
}Cela produit `SyntaxError: Bad control character in string literal in JSON at position 21` — une des rares erreurs JSON qui nomme le problème réel au lieu d'un simple jeton. La correction consiste à échapper le caractère plutôt que de le laisser apparaître brut : `"line one\nline two"`.
Clés dupliquées, NaN/Infinity/undefined et caractères BOM
Trois modes de défaillance plus discrets, à connaître par leur nom. Premièrement, les clés dupliquées dans un objet JSON ne provoquent aucune erreur d'analyse — `{ "id": 1, "id": 2 }` s'analyse avec succès, et JSON.parse conserve silencieusement la dernière occurrence (`id: 2`) en écartant la première. La RFC 8259 dit que les noms « devraient » être uniques mais n'impose pas aux analyseurs de rejeter les doublons : c'est un comportement conforme à la spécification, facile à manquer en revue, plutôt qu'un bogue de votre analyseur.
Deuxièmement, `NaN`, `Infinity` et `undefined` sont tous valides en JavaScript mais aucun n'est un jeton JSON valide — JSON n'a que `number`, pas les valeurs spéciales IEEE-754, et n'a pas du tout de concept d'`undefined` (seulement `null`). `{ "value": NaN }` lève `Unexpected token 'N', ..."value":NaN}"... is not valid JSON` (ou `Unexpected token N in JSON at position 10` sur les moteurs plus anciens). Si vous sérialisez depuis JavaScript, `JSON.stringify` convertit déjà `NaN`/`Infinity` en `null` et supprime entièrement les valeurs `undefined` — l'erreur signifie généralement que le JSON a été écrit à la main ou provient d'une source non-JS qui supposait la sémantique JS.
Troisièmement, une marque d'ordre d'octets UTF-8 (U+FEFF) au tout début d'un fichier — souvent ajoutée silencieusement par des éditeurs Windows ou certains outils Java/.NET lors d'un enregistrement en UTF-8 — casse `JSON.parse` quand le fichier est lu comme une chaîne brute, produisant `Unexpected token '\ufeff'... is not valid JSON` à la position 0. Notez que c'est spécifiquement un problème de `JSON.parse` sur une chaîne : `Response.json()` de l'API Fetch décode le texte UTF-8 et retire un BOM en tête dans le cadre de ce décodage, donc les mêmes octets servis via HTTP et lus depuis le disque avec `fs.readFileSync(path, 'utf8')` peuvent se comporter différemment.
Lire la position, et quand utiliser un outil de réparation
La `position` dans une erreur JSON.parse est un décalage de caractères indexé à zéro dans la chaîne exacte que vous avez transmise, pas un numéro de ligne — Node (v20+) calcule et ajoute en plus un `(line X column Y)` par commodité, mais les runtimes et navigateurs plus anciens ne donnent que le décalage brut. Deux choses piègent les gens : la position signalée est l'endroit où l'analyseur a remarqué que la grammaire était cassée, ce qui, pour une virgule finale ou un crochet manquant, se situe souvent un jeton après votre erreur réelle ; et si vous avez mis le JSON en forme pour la lisibilité mais déboguez la chaîne minifiée d'origine, les décalages ne correspondront pas à ce que vous voyez à l'écran.
Pour une erreur de syntaxe ponctuelle dans un document court, la corriger à la main une fois la position localisée est plus rapide que n'importe quel outil — collez-la dans un validateur qui surligne le caractère exact plutôt que de compter les décalages manuellement. Pour un gros fichier avec plusieurs erreurs sans rapport, du JSON généré par un outil bogué en amont, ou du JSON passé par plusieurs rondes de copier-coller avec perte, la correction manuelle n'en vaut plus la peine. C'est le moment d'utiliser quelque chose d'automatisé : le JSON Validator de JsonForge localise chaque violation de schéma avec un chemin précis une fois que le document s'analyse au moins, et JSON Repair tente de corriger automatiquement les erreurs structurelles courantes (guillemets manquants, virgules finales, crochets déséquilibrés) quand l'entrée est trop abîmée pour être corrigée erreur par erreur.
FAQ
- Pourquoi JSON.parse échoue-t-il sur un fichier qui semble parfaitement correct ?
- Les coupables invisibles les plus courants sont un caractère de marque d'ordre d'octets (BOM) en tête, et les « guillemets intelligents » ou tirets cadratins introduits par un copier-coller depuis un traitement de texte, une application de messagerie ou un PDF — tous deux sont identiques en apparence à un simple guillemet double ou tiret dans la plupart des polices, mais ce sont des caractères Unicode différents que JSON.parse rejette. Ouvrez le fichier dans un éditeur capable de révéler les caractères masqués/non-ASCII, ou comparez-le à une version connue comme bonne.
- Pourquoi une clé dupliquée n'est-elle pas traitée comme une erreur ?
- La spécification JSON (RFC 8259) dit que les noms de membres d'objets « devraient » être uniques mais n'impose pas que les analyseurs le vérifient, donc le comportement est laissé à l'implémentation. Le JSON.parse de JavaScript conserve silencieusement le dernier doublon ; les analyseurs d'autres langages lèvent une erreur, et d'autres conservent la première occurrence. Ne comptez jamais sur un comportement cohérent des clés dupliquées d'un environnement à l'autre.
- Puis-je faire accepter à JSON.parse les virgules finales ou les commentaires ?
- Pas JSON.parse lui-même — il implémente strictement la grammaire JSON sans option de tolérance. Si vous avez besoin de commentaires ou de virgules finales, utilisez un analyseur sur-ensemble comme JSON5 ou un analyseur conscient du JSONC, ou retirez la syntaxe fautive avant d'appeler JSON.parse. N'essayez pas d'écrire votre propre nettoyage à base d'expressions régulières au-delà de scripts jetables — il est facile de corrompre par inadvertance des virgules ou des accolades présentes dans des valeurs de chaîne.
- Quelle est la façon la plus rapide de localiser une erreur dans un fichier énorme ?
- Ne comptez pas les caractères à la main. Collez le document dans un formateur ou un validateur qui surligne visuellement la ligne et la colonne exactes fautives — cela transforme un comptage manuel de plusieurs minutes en une recherche instantanée, surtout quand le fichier est assez gros pour que le décalage brut de caractères ne signifie rien pour un humain.
Essayez ces outils
Articles associés
Qu'est-ce que JSON ? Le guide complet pour débutants →
JSON (JavaScript Object Notation) est un format d'échange de données léger, facile à lire pour les humains et à analyser pour les machines. Apprenez la syntaxe, les types de données et la structure qui font tourner les API modernes.
L'histoire de JSON : de 2000 au standard de l'industrie →
Suivez JSON depuis l'idée de Douglas Crockford en 2001, en passant par son adoption par Yahoo, jusqu'à devenir le standard ECMA-404 qui fait tourner 90 % des API modernes.
Le guide complet de JSON Schema (Draft 7) →
JSON Schema est le standard pour décrire et valider la structure JSON. Apprenez les mots-clés essentiels, construisez un véritable schéma d'API et appliquez les bonnes pratiques.