Aller au contenu
jsonbeautifiers
Français
V8 Vérifié en exécutant l’analyseur sur Node v24.15.0, V8 13.6.233.17.

"[object Object]" is not valid JSON

JSON.parse attend une chaîne. Quand vous lui passez un objet, JavaScript convertit d’abord cet objet en chaîne, et la conversion par défaut produit le texte littéral "[object Object]". L’analyseur échoue alors sur le o en position 1. Les données vont bien ; c’est l’appel à parse qui n’a rien à faire là.

Vous pouvez aussi le voir écrit ainsi

  • Unexpected token o in JSON at position 1

V8 a réécrit la plupart de ses messages d’erreur JSON en 2022. L’ancienne formulation reste ce que montrent la plupart des résultats de recherche, mais aucun runtime actuel ne l’émet.

Collez votre JSON et voyez exactement où il casse

Entrée

Rien de ce que vous collez ne quitte votre navigateur. La liste d’autorisation connect-src en fait une garantie du navigateur plutôt qu’une promesse. Vérifiez-le vous-même

Ce qui le provoque réellement

Classés selon la fréquence à laquelle chacun se révèle être la réponse.

  1. 01 La valeur était déjà analysée

    axios, jQuery.ajax et beaucoup de clients d’API analysent le JSON pour vous quand le Content-Type le dit. Analyser à nouveau le résultat est ce qui déclenche cela.

    Casse

    const res = await axios.get('/api/user');
    const user = JSON.parse(res.data);   // res.data is already an object

    Fonctionne

    const res = await axios.get('/api/user');
    const user = res.data;
  2. 02 Un objet a été stocké sans être sérialisé

    localStorage et sessionStorage stockent des chaînes. Leur passer un objet appelle String(obj), ce qui écrit le texte littéral "[object Object]". À ce moment-là les données sont perdues, pas seulement illisibles.

    Casse

    localStorage.setItem('user', user);
    const back = JSON.parse(localStorage.getItem('user'));

    Fonctionne

    localStorage.setItem('user', JSON.stringify(user));
    const back = JSON.parse(localStorage.getItem('user'));
  3. 03 Un objet a été interpolé dans un littéral de gabarit

    Construire un corps de requête avec `{"user": ${user}}` insère "[object Object]" plutôt que l’objet. Construisez plutôt l’objet et sérialisez l’ensemble.

    Casse

    body: `{"user": ${user}}`

    Fonctionne

    body: JSON.stringify({ user })

Questions fréquentes

Qu’est devenu « Unexpected token o in JSON at position 1 » ?
C’était la formulation V8 d’avant 2022 pour la même erreur. Le o était le deuxième caractère de la chaîne "[object Object]". Le message moderne cite le texte fautif à la place, ce qui est bien plus utile.
Comment rendre cela défensif ?
typeof value === "string" ? JSON.parse(value) : value. C’est une garde raisonnable à une frontière que vous ne contrôlez pas, même si dans votre propre code il vaut mieux savoir lequel des deux vous avez.

Corrigez-le maintenant

Collez le payload dans l’outil ci-dessus, ou allez directement à celui conçu pour ce travail.

Inspecter un payload