"[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
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.
-
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 objectFonctionne
const res = await axios.get('/api/user'); const user = res.data; -
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')); -
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