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 scheitert entsprechend.
Nachricht
TypeError: Converting circular structure to JSON (V8-based) TypeError: cyclic object value (Firefox) TypeError: JSON.stringify cannot serialize cyclic structures. (Safari)
Fehlerart
Was ist schiefgelaufen?
Das JSON-Format unterstützt an sich keine Objektverweise (obwohl ein IETF-Draft existiert), daher versucht JSON.stringify()
nicht, sie zu lösen, und scheitert entsprechend.
Beispiele
Zirkuläre Referenzen
In einer zirkulären Struktur wie der folgenden:
const circularReference = { otherData: 123 };
circularReference.myself = circularReference;
wird JSON.stringify()
fehlschlagen
JSON.stringify(circularReference);
// TypeError: cyclic object value
Um zirkuläre Referenzen zu serialisieren, können Sie eine Bibliothek verwenden, die sie unterstützt (z.B. cycle.js) oder selbst eine Lösung implementieren, die das Finden und Ersetzen (oder Entfernen) der zyklischen Referenzen durch serialisierbare Werte erfordert.
Der folgende Codeausschnitt zeigt, wie man mit dem replacer
-Parameter von JSON.stringify()
eine zyklische Referenz findet und filtert (was zu Datenverlust führt):
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
JSON.stringify()
- cycle.js auf GitHub