We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Message

TypeError: cyclic object value (Firefox)
TypeError: Converting circular structure to JSON (Chrome and Opera)
TypeError: Circular reference in value argument not supported (Microsoft Edge)

Type d'erreur

TypeError

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. Douglas Crockford a par exemple écrit 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.

Étiquettes et contributeurs liés au document

Étiquettes : 
Contributeurs à cette page : SphinxKnight
Dernière mise à jour par : SphinxKnight,