TypeError: циклический объект
JavaScript-исключение "циклический объект" возникает, когда в JSON были найдены ссылки на объекты. JSON.stringify() не пытается их решить и соответствующим образом выдает ошибку.
Сообщение
TypeError: Converting circular structure to JSON (V8-based) TypeError: cyclic object value (Firefox) TypeError: JSON.stringify cannot serialize cyclic structures. (Safari)
Тип ошибки
Что пошло не так?
Сам по себе формат JSON не поддерживает ссылки на объекты (хотя существует черновик IETF), поэтому JSON.stringify() не пытается их решить и соответствующим образом выдает ошибку.
Примеры
Циклические ссылки
В циклической структуре, подобной следующей:
const circularReference = { otherData: 123 };
circularReference.myself = circularReference;
JSON.stringify() выдаст ошибку
JSON.stringify(circularReference); // TypeError: cyclic object value
Для сериализации циклических ссылок вы можете использовать библиотеку, которая их поддерживает (например, cycle.js) или реализовать решение самостоятельно, что потребует поиска и замены (или удаления) циклических ссылок на сериализуемые значения.
Приведенный ниже фрагмент кода демонстрирует, как найти и отфильтровать (тем самым вызвав потерю данных) циклическую ссылку с помощью параметра replacer метода JSON.stringify():
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());
// [{},{}]
См. также
JSON.stringify()- cycle.js на GitHub
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value