TypeError: cyclic object value

Der JavaScript-Fehler "cyclic object value" tritt auf, wenn Objektverweise in JSON gefunden werden. JSON.stringify() versucht nicht, diese zu lösen, und schlägt dementsprechend fehl.

Meldung

TypeError: Converting circular structure to JSON (V8-based)
TypeError: cyclic object value (Firefox)
TypeError: JSON.stringify cannot serialize cyclic structures. (Safari)

Fehlertyp

Was ist schiefgelaufen?

Das JSON-Format unterstützt an sich keine Objektverweise (obwohl ein IETF-Entwurf existiert), daher versucht JSON.stringify() nicht, diese zu lösen, und schlägt dementsprechend fehl.

Beispiele

Zyklische Verweise

In einer zyklischen Struktur wie der folgenden:

js
const circularReference = { otherData: 123 };
circularReference.myself = circularReference;

wird JSON.stringify() fehlschlagen

js
JSON.stringify(circularReference);
// TypeError: cyclic object value

Um zyklische Verweise zu serialisieren, können Sie eine Bibliothek verwenden, die diese unterstützt (z. B. cycle.js) oder eine eigene Lösung implementieren, die das Auffinden und Ersetzen (oder Entfernen) der zyklischen Verweise durch serialisierbare Werte erfordert.

Der folgende Code zeigt, wie man mithilfe des replacer-Parameters von JSON.stringify() einen zyklischen Verweis finden und filtern kann (was zu Datenverlust führt):

js
function getCircularReplacer() {
  const ancestors = [];
  return function (key, value) {
    if (typeof value !== "object" || value === null) {
      return value;
    }
    // `this` is the object that value is contained in,
    // i.e., its direct parent.
    while (ancestors.length > 0 && ancestors.at(-1) !== this) {
      ancestors.pop();
    }
    if (ancestors.includes(value)) {
      return "[Circular]";
    }
    ancestors.push(value);
    return value;
  };
}

JSON.stringify(circularReference, getCircularReplacer());
// {"otherData":123,"myself":"[Circular]"}

const o = {};
const notCircularReference = [o, o];
JSON.stringify(notCircularReference, getCircularReplacer());
// [{},{}]

Siehe auch