AlexXYZ
@AlexXYZ
O Keep Clear O

JSON.Stringify со ссылками?

Всем привет.

Существует ли какая-то возможность сохранить сложный JSON с подобъектами с учётом внутренних перекрёстных ссылок ? (Контекст - браузер).
P.S.
Ссылки внутри JSON могут быть рекурсивными. JSON.Stringify на этом вообще ломается.

P.P.S.
Есть у меня свой условный "конвертер", но вдруг я иду не в том направлении?
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 3
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Сам формат JSON не имеет поддержки рекурсивных и перекрёстных ссылок, однако можно сделать свой формат поверх JSON с такой поддержкой.
JSON.stringify поддерживает параметр replacer, а JSON.parse - параметр reviver, которые позволяют обрабатывать каждое значение при сериализации/десериализации
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Придется слегка "нормализовать" объект.
Например, было так:
const obj = {
    a: 123,
    b: {
        v: 'qq'
    },
    c: {
        x: {}
    },
};
obj.c.d = obj.b; // перекрестная ссылка
obj.c.r = obj; // кольцевая ссылка


в нормальзованном варианте должно стать
const norm = {
    '#0': {
        a: 123,
        b: '#1',
        c: {
            x: {},
            d: '#1',
            r: '#0'
        },
    },
    '#1': {
        v: 'qq'
    }
}


можно обойти объект рекурсивно, считая ссылки на подобъекты (с помощью Map). Если что-то используется хотя бы дважды, как, например, obj.b, оно выносится отдельно и получает уникальный id. Корневой объект всегда обозначается как '#0'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы