Сериализация объекта, содержащего значение циклического объекта
-
28-10-2019 - |
Вопрос
У меня есть объект (дерево синтаксического анализа), содержащий дочерние узлы, которые являются ссылками на другие узлы.
Я хотел бы сериализовать этот объект, используя код JSON.stringify()
, но получаю
TypeError: значение циклического объекта
из-за упомянутых мною конструкций.
Как я могу обойти это?Для меня не имеет значения, представлены ли эти ссылки на другие узлы в сериализованном объекте или нет.
С другой стороны, удаление этих свойств из объекта при их создании кажется утомительным, и я бы не хотел вносить изменения в парсер (нарцисс).
Решение
Используйте второй параметр stringify
, функция replacer , чтобы исключить уже сериализованные объекты:
Как правильно указано в других комментариях, этот код удаляет все «видимые» объекты, а не только «рекурсивные».
Например, для:
родовое словорезультат будет неверным. Если ваша структура подобна этой, вы можете использовать decycle или эту (более простую) функцию, которая просто заменяет рекурсивные ссылки нулями:
Другие советы
Я создал GitHub Gist, который может обнаруживать циклические структуры, а также расшифровывать и кодировать их: https://gist.github.com/Hoff97/9842228
Для преобразования просто используйте JSONE.stringify / JSONE.parse. Он также декодирует и кодирует функции.Если вы хотите отключить это, просто удалите строки 32-48 и 61-85.
родовое словоЗдесь вы можете найти пример скрипки:
намного экономнее, и он показывает, где был объект цикла .
родовое словопроизводит
родовое словоОтсутствует предусловие, иначе целочисленные значения в объектах массива усекаются, т.е. [[08.11.2014 12:30:13, 1095]] 1095 уменьшается до 095.
Я также создаю проект github, который может сериализовать циклический объект и восстановить класс, если вы сохраните его в атрибуте serializename как String
родовое словоhttps://github.com/bormat/serializeStringifyParseCyclicObject
Изменить: Я преобразовал свой скрипт для NPM https://github.com/bormat/borto_circular_serialize и внес измененияимена функций с французского на английский.