TypeError: cyclic object value
Сообщения
TypeError: циклическое значение объекта (Firefox) TypeError: преобразование круговой структуры в JSON (Chrome и Opera) TypeError: циклическая ссылка в аргументе значения не поддерживается (Edge)
Тип ошибки?
Что не так?
Сам по себе JSON-формат не поддерживает ссылки на объекты (не смотря на то что существует IETF, который позволяет значению JSON ссылаться на другое значение в JSON-документе), поэтому JSON.stringify()
не пытаеться их анализировать и терпит неудачу при попытке сделать это.
Примеры
В круговой структуре как эта
var circularReference = { otherData: 123 };
circularReference.myself = circularReference;
JSON.stringify()
закончится неудачей
JSON.stringify(circularReference);
// TypeError: циклическое значение объекта
Для сериализации циклических ссылок можно использовать библиотеку, которая их поддерживает (например, cycle.js) или самостоятельно реализовать решение, которое потребует поиска и замены (или удаления) циклических ссылок сериализуемыми значениями.
Во фрагменте кода ниже показано, как найти и отфильтровать циклическую ссылку (что приводит к потере данных) с помощью параметра replacer
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
- cycle.js – вводит две функции, JSON.decycle и JSON.retrocycle, что даёт возможность кодирования и декодирования циклических структур и групп обеспечения доступности баз данных в расширенный и обратно совместимый формат JSON.