The JavaScript exception "cyclic object value" occurs when object references were found in
JSON
.
JSON.stringify()
doesn't try to solve them and fails accordingly.
TypeError: cyclic object value (Firefox) TypeError: Converting circular structure to JSON (Chrome and Opera) TypeError: Circular reference in value argument not supported (Edge)
JSON format
per se doesn't support object references (although an
IETF draft exists
), hence
JSON.stringify()
doesn't try to solve them and fails accordingly.
In a circular structure like the following
var circularReference = {otherData: 123};
circularReference.myself = circularReference;
JSON.stringify()
will fail
JSON.stringify(circularReference); // TypeError: cyclic object value
To serialize circular references you can use a library that supports them (e.g. cycle.js ) or implement a solution by yourself, which will require finding and replacing (or removing) the cyclic references by serializable values.
The snippet below illustrates how to find and filter (thus causing data loss) a cyclic reference by using the
replacer
parameter of
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}
JSON.stringify
JSON.decycle
and
JSON.retrocycle
, which makes it possible to encode and decode cyclical structures and dags into an extended and retrocompatible JSON format.