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.