TypeError: cyclic object value
Message
TypeError: cyclic object value (Firefox) TypeError: Converting circular structure to JSON (Chrome and Opera) TypeError: Circular reference in value argument not supported (Edge)
Type d'erreur
Quel est le problème ?
Lorsqu'on appelle la méthode JSON.stringify()
, les structures de références cycliques ne peuvent pas être converties en chaîne de caractères car le format JSON ne prend pas en charge les références (bien qu'un brouillon IETF existe).
Exemples
Avec une structure circulaire comme la suivante :
var a = {};
var b = {};
a.child = b;
b.child = a;
JSON.stringify()
échouera :
JSON.stringify(a);
// TypeError: cyclic object value
Il est nécessaire de contrôler l'existence de cycles avant la conversion en chaîne de caractères. On peut par exemple fournir une fonction de remplacement comme deuxième argument de la fonction JSON.stringify()
.
const getCircularReplacer = () => {
const seen = new WeakSet();
return (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return;
}
seen.add(value);
}
return value;
};
};
JSON.stringify(circularReference, getCircularReplacer());
// {"otherData":123}
On peut également utiliser une bibliothèque ou une fonction utilitaire pour ce scénario. comme cycle.js.
Voir aussi
JSON.stringify
- cycle.js qui introduit deux fonctions :
JSON.decycle
et JSON.retrocycle
qui permettent d'encoder et de décoder des structures cycliques en JSON.