Сериализация объекта, содержащего значение циклического объекта

StackOverflow https://stackoverflow.com/questions/9382167

Вопрос

У меня есть объект (дерево синтаксического анализа), содержащий дочерние узлы, которые являются ссылками на другие узлы.

Я хотел бы сериализовать этот объект, используя код JSON.stringify(), но получаю

<цитата>

TypeError: значение циклического объекта

из-за упомянутых мною конструкций.

Как я могу обойти это?Для меня не имеет значения, представлены ли эти ссылки на другие узлы в сериализованном объекте или нет.

С другой стороны, удаление этих свойств из объекта при их создании кажется утомительным, и я бы не хотел вносить изменения в парсер (нарцисс).

Это было полезно?

Решение

Используйте второй параметр stringify, функция replacer , чтобы исключить уже сериализованные объекты:

родовое слово

http://jsfiddle.net/mH6cJ/38/

Как правильно указано в других комментариях, этот код удаляет все «видимые» объекты, а не только «рекурсивные».

Например, для:

родовое слово

результат будет неверным. Если ваша структура подобна этой, вы можете использовать decycle или эту (более простую) функцию, которая просто заменяет рекурсивные ссылки нулями:

родовое слово

Другие советы

Я создал GitHub Gist, который может обнаруживать циклические структуры, а также расшифровывать и кодировать их: https://gist.github.com/Hoff97/9842228

Для преобразования просто используйте JSONE.stringify / JSONE.parse. Он также декодирует и кодирует функции.Если вы хотите отключить это, просто удалите строки 32-48 и 61-85.

родовое слово

Здесь вы можете найти пример скрипки:

http://jsfiddle.net/hoff97/7UYd4/

намного экономнее, и он показывает, где был объект цикла .

родовое слово

производит

родовое слово
родовое слово

Отсутствует предусловие, иначе целочисленные значения в объектах массива усекаются, т.е. [[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 и внес измененияимена функций с французского на английский.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top