Vous lancez votre code, regardez l'onglet Network et vous le voyez : "[object Object]" is not
valid JSON. Ou peut-être que votre validateur JSON dit Expected a JSON object, array or literal, ou que votre parseur s'étrangle sur une virgule après le dernier élément. Ces erreurs comptent parmi les fautes JSON les plus courantes — et les plus déroutantes — que rencontrent les développeurs. Ce guide explique exactement ce que veut dire chaque erreur, pourquoi elle survient, et comment corriger la syntaxe JSON pour que votre parseur l'accepte.
Que signifie « [object Object] is not valid JSON » ?
Quand JavaScript convertit un objet en chaîne sans utiliser JSON.stringify(), le résultat est le texte [object Object] — la sortie par défaut de la méthode .toString() de tout objet. Si cette chaîne est ensuite passée à JSON.parse() ou envoyée comme corps de requête, vous obtenez l'erreur :
SyntaxError: "[object Object]" is not valid JSONLe parseur essaie de parser le texte littéral [object Object]. Il voit [, attend un tableau JSON, trouve le mot non quoté object, et échoue. Le crochet est réel — c'est le premier caractère de la chaîne [object Object] — mais ce qui suit n'est pas une syntaxe de tableau JSON valide.
Pourquoi [object Object] apparaît-il dans le JSON ?
La cause racine est toujours la même : un objet JavaScript a été contraint en chaîne quelque part dans le code avant d'être parsé ou transmis. Voici les quatre manières les plus courantes :
Concaténation de chaînes
Quand vous concaténez un objet à une chaîne, JavaScript appelle .toString() sur l'objet, ce qui renvoie [object Object] :
const user = { name: "Alice", age: 30 };
// ❌ La concaténation contraint l'objet
const body = "data=" + user;
console.log(body); // "data=[object Object]"
// ✅ Utiliser JSON.stringify
const body = "data=" + JSON.stringify(user);Corps de fetch / XMLHttpRequest sans JSON.stringify
Passer un objet brut comme body d'un appel fetch le convertit automatiquement en chaîne :
const payload = { action: "login", user: "alice" };
// ❌ fetch contraint l'objet en "[object Object]"
fetch('/api/login', {
method: 'POST',
body: payload,
});
// ✅ Sérialiser d'abord, définir Content-Type
fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});Littéraux de gabarit
Embarquer un objet directement dans un littéral de gabarit appelle .toString() :
const config = { theme: "dark", lang: "en" };
// ❌ Contrainte via littéral de gabarit
const json = `{"config": ${config}}`;
// '{"config": [object Object]}' ← JSON invalide
// ✅ Stringifier seulement l'objet
const json = `{"config": ${JSON.stringify(config)}}`;
// '{"config": {"theme":"dark","lang":"en"}}'Stringify imbriqué
Appeler JSON.stringify() sur un objet qui contient déjà une chaîne JSON pré-sérialisée comme valeur produit une sortie doublement encodée — le littéral de chaîne apparaît dans le JSON au lieu de l'objet qu'il représente :
const inner = JSON.stringify({ id: 1 }); // '{"id":1}'
const outer = JSON.stringify({ data: inner });
// '{"data":"{\"id\":1}"}' — le champ data est une chaîne, pas un objet
// Si cette chaîne externe est ensuite JSON.parse()'ée et que data est ré-utilisé comme JSON,
// il faut faire JSON.parse(result.data) une seconde fois.Comment corriger l'erreur [object Object] JSON
Le correctif consiste toujours à s'assurer que l'objet est sérialisé avec JSON.stringify() avant d'être utilisé comme chaîne ou transmis sur le réseau. Un diagnostic rapide : cherchez dans votre code chaque endroit où la variable concernée est utilisée comme chaîne et ajoutez-y JSON.stringify().
// Schéma de correction systématique
function toJsonBody(obj) {
if (typeof obj === 'string') {
// Déjà une chaîne — valider qu'elle est du JSON valide avant usage
JSON.parse(obj); // lève si invalide
return obj;
}
return JSON.stringify(obj);
}« Expected a JSON Object, Array or Literal » — ce que ça veut dire
Cette erreur provient du visualiseur JSON intégré de Firefox (et de certains validateurs JSON) et signifie que la valeur de plus haut niveau de votre JSON n'est aucun des six types JSON valides. Causes courantes :
- L'entrée est une chaîne vide.
JSON.parse("")lève cette erreur parce qu'une chaîne vide n'est pas une valeur JSON valide. - L'entrée est
undefined.JSON.stringify(undefined)renvoieundefined(pas la chaîne"undefined"), etJSON.parse(undefined)lève. - La réponse est du HTML, pas du JSON. Une page d'erreur serveur renvoie souvent du HTML. Le premier caractère
<n'est pas du JSON valide. Vérifiez l'en-têteContent-Typeet le corps de réponse brut dans l'onglet Network avant de conclure que le JSON lui-même est cassé. - Il y a un BOM en début de fichier. Un BOM UTF-8 (octets
0xEF 0xBB 0xBF) préposé à un fichier JSON provoque cette erreur dans les parseurs stricts. RFC 8259 interdit explicitement les BOM dans JSON.
// Garder contre vide / undefined avant de parser
function safeParse(text) {
if (!text || typeof text !== 'string') {
throw new TypeError(`Cannot parse ${typeof text} as JSON`);
}
return JSON.parse(text.trimStart()); // trimStart retire les BOM/espaces accidentels
}Virgule JSON après le dernier élément : l'erreur de virgule finale
Autre erreur de syntaxe JSON extrêmement courante : une virgule finale — une virgule qui apparaît après le dernier élément d'un objet ou d'un tableau :
// ❌ Virgule finale dans un objet
{
"name": "Alice",
"age": 30,
}
// ❌ Virgule finale dans un tableau
["red", "green", "blue",]La grammaire JSON impose qu'une virgule sépare deux éléments — il doit toujours y avoir une valeur de chaque côté. Une virgule sans rien après viole la grammaire. JavaScript lui-même autorise les virgules finales (depuis ES5), c'est pourquoi les développeurs en écrivent sans y penser.
Pour trouver et corriger les virgules finales programmatiquement :
// ⚠️ Correctif regex — marche pour les cas simples, peut corrompre des chaînes
const fixed = raw.replace(/,\s*([}\]])/g, '$1');
// ✅ Mieux : utiliser un parseur de réparation qui comprend la grammaire
// par ex. la bibliothèque json-repair sur npmPour une plongée dans cette erreur précise, voir Virgule finale en JSON : pourquoi ça lève et comment corriger.
Comment corriger la syntaxe JSON : checklist complète
Avant de dégainer un outil de correction JSON, parcourez cette checklist pour identifier la classe d'erreur :
Structure
- Chaque
{a un}correspondant et chaque[a un]correspondant. Les crochets non fermés sont parmi les erreurs de troncature les plus fréquentes. - Pas de virgule finale — pas de virgule après la dernière paire clé–valeur d'un objet ni le dernier élément d'un tableau.
- Pas de virgule manquante — chaque élément d'un objet ou tableau (sauf le dernier) doit être suivi d'une virgule.
Chaînes
- Toutes les chaînes utilisent des guillemets doubles. Les chaînes en guillemets simples (
'Alice') sont de la syntaxe JavaScript, pas JSON. - Toutes les clés d'objet sont des chaînes entre guillemets doubles. Les clés nues (
{ name: "Alice" }) sont de la syntaxe d'objet littéral JavaScript, pas JSON. - Les caractères de contrôle dans les chaînes doivent être échappés. Les sauts de ligne, tabulations et octets nuls bruts dans une chaîne JSON sont illégaux — utilisez
\n,\t,\u0000à la place.
Valeurs
- Les booléens sont en minuscules :
true/false, pasTrue/False/TRUE. - Null est en minuscules :
null, pasNone,nil, niNULL. - Pas d'
undefined. JSON n'a pas de type undefined ; utiliseznullou omettez la clé. - Pas de
NaNniInfinity. Ces valeurs JavaScript n'ont pas de représentation JSON.JSON.stringify({x: Infinity})produit{"x":null}en silence.
Contenu supplémentaire
- Pas de commentaires.
// commentaires de ligneet/* commentaires de bloc */ne font pas partie de la spécification JSON. - Pas de contenu en trop. Un texte JSON valide est exactement une seule valeur — rien avant (sauf un espace optionnel) ni rien après.
Utiliser un correcteur JSON : quand automatiser
Pour le débogage ponctuel, corriger le JSON à la main est rapide. Pour des pipelines de production qui reçoivent du JSON depuis des sources externes — APIs, sorties de modèles IA, entrée utilisateur — il vous faut un correcteur JSON : code ou outil qui répare programmatiquement les erreurs de syntaxe courantes sans casser le contenu valide.
Un bon correcteur JSON gère :
- Les virgules finales dans les objets et tableaux
- Les chaînes en guillemets simples → chaînes en guillemets doubles
- Les clés non quotées → clés entre guillemets doubles
- Les littéraux Python (
True,False,None) → équivalents JSON - Les commentaires JavaScript
// ligneet/* bloc */→ supprimés - Les balises de bloc de code Markdown (
```json ... ```) → retirées - Les crochets non fermés → refermés automatiquement
Exigence clé : les corrections doivent être conscientes de la grammaire — l'outil comprend quels tokens sont des séparateurs structurels et lesquels sont à l'intérieur des valeurs de chaîne, afin de ne jamais corrompre un contenu de chaîne qui contient justement ,} ou True.
Pour un tutoriel sur l'implémentation de la réparation JSON en code JavaScript, voir Comment gérer du JSON cassé en JavaScript.
Éviter les pièges de JSON.stringify (références circulaires comprises)
Une fois qu'on prend l'habitude de toujours sérialiser avec JSON.stringify, deux situations continuent de piéger :
- Les références circulaires lèvent. Une valeur comme
const a = {}; a.self = a;donneTypeError: Converting circular structure to JSON. Trois bonnes alternatives : abandonner la référence arrière avec unreplacerpersonnalisé qui suit les objets vus ; passer àstructuredClone(value)pour des copies profondes en mémoire ; ou utiliser une bibliothèque commeflattedquand on doit vraiment sérialiser un graphe cyclique et le reconstruire plus tard. - Types avec perte.
JSON.stringifysupprime silencieusementundefined, les fonctions et les valeursSymbol, et convertitNaN/Infinityennull. Convertissez-les en quelque chose de représentable avant stringify, pas après parsing.
Référence rapide : erreurs JSON courantes et correctifs
// 1. [object Object] — objet contraint en chaîne
❌ fetch(url, { body: myObject })
✅ fetch(url, { body: JSON.stringify(myObject) })
// 2. Virgule finale
❌ { "a": 1, "b": 2, }
✅ { "a": 1, "b": 2 }
// 3. Guillemets simples
❌ { 'name': 'Alice' }
✅ { "name": "Alice" }
// 4. Clé non quotée
❌ { name: "Alice" }
✅ { "name": "Alice" }
// 5. Booléen Python
❌ { "active": True }
✅ { "active": true }
// 6. Commentaire en JSON
❌ { "debug": true // log everything }
✅ { "debug": true }
// 7. Chaîne vide
❌ JSON.parse("")
✅ JSON.parse(text || "null")
// 8. Page d'erreur HTML prise pour du « JSON »
❌ JSON.parse("<!DOCTYPE html>...")
✅ Vérifier response.ok et Content-Type avant d'appeler response.json()Foire aux questions
Que signifie « [object Object] is not valid JSON » ?
Un objet JavaScript a été converti en chaîne avec sa .toString() par défaut, produisant le texte littéral [object Object], qui a ensuite été parsé ou envoyé comme JSON. Le correctif consiste à sérialiser avec JSON.stringify() avant d'utiliser la valeur comme chaîne.
Comment corriger l'erreur [object Object] dans une requête fetch ?
Mettez body: JSON.stringify(payload) et ajoutez un en-tête Content-Type: application/json. Passer un objet brut comme body le contraint en [object Object].
Qu'est-ce que « Expected a JSON object, array or literal » ?
Firefox et certains validateurs l'affichent quand la valeur de plus haut niveau n'est pas l'un des six types JSON — généralement parce que l'entrée est vide, est undefined, est du HTML au lieu de JSON, ou commence par un BOM. Vérifiez d'abord response.ok et l'en-tête Content-Type.
Quelles sont les erreurs de syntaxe JSON les plus courantes ?
Virgules finales, guillemets simples, clés non quotées, littéraux Python (True/None), commentaires, et NaN/Infinity. Chacun a son guide dédié : voir virgules finales, erreurs unexpected-token, unexpected end of input, et caractères de contrôle invalides.
Corriger la syntaxe JSON en ligne — sans installation
Si vous avez une chaîne JSON cassée à corriger tout de suite, JSON Fix répare automatiquement toutes les erreurs ci-dessus. Collez votre JSON — aussi cassé soit-il — cliquez sur Repair & Format, et récupérez un JSON syntaxiquement correct et formaté. L'outil tourne entièrement dans votre navigateur : aucune donnée n'est envoyée à un serveur, ce qui est sûr pour les payloads sensibles.
- JSON Fix — réparer et formater du JSON cassé en un instant
- Comment gérer du JSON cassé en JavaScript — ajouter une réparation JSON élégante à votre propre code d'application
- Unexpected Token o in JSON at Position 1 — le cousin proche de l'erreur [object Object]
- Qu'est-ce que JSON ? — un guide complet sur le format, la syntaxe et les types de données JSON
- JSON Diff — comparer le JSON original et corrigé pour vérifier que votre correctif est exact