как настроить json stringify работать со stringifier и обрабатывать циркулярные ссылки

Аватар пользователя Nikolai Gagarinov
Nikolai Gagarinov
26 февраля 2025

Чтобы настроить JSON.stringify() для работы с циркулярными ссылками, мы можем воспользоваться параметром replacer этого метода. replacer — это функция, которая позволяет изменять поведение сериализации JSON.

Для обработки циркулярных ссылок в объекте, которые могут привести к ошибке "Converting circular structure to JSON", мы можем использовать дополнительное хранилище, например, Set, чтобы отслеживать уже сериализованные объекты и избежать повторной сериализации.

Вот пример кода, который иллюстрирует этот подход:

const customStringify = (obj) => {
    const seen = new Set();
    return JSON.stringify(obj, (key, value) => {
        if (typeof value === 'object' && value !== null) {
            if (seen.has(value)) {
                return '[Circular]';
            }
            seen.add(value);
        }
        return value;
    });
};

const obj = {
    name: 'John',
    age: 30
};
obj.self = obj; // циркулярная ссылка

const jsonString = customStringify(obj);
console.log(jsonString);

В этом примере функция customStringify() принимает объект и использует замыкание, чтобы хранить уже просмотренные объекты в Set. Если сериализуемый объект уже был просмотрен, вместо сериализации он возвращает '[Circular]'.

Теперь, когда мы будем использовать customStringify() вместо JSON.stringify(), он будет обрабатывать циркулярные ссылки и сериализовывать объекты без ошибок.

Это один из способов обработки циркулярных ссылок при использовании JSON.stringify(). В зависимости от наших конкретных потребностей, возможно, потребуется изменить или расширить этот подход.

0 0