我有一个对象(解析树),其中包含子节点,这些子节点是对其他节点的引用。

我想使用JSON.stringify()序列化此对象,但是我得到

TypeError:循环对象值

因为我提到的结构。

我该如何解决?对我来说,这些对其他节点的引用是否在序列化对象中表示,对我来说都没有关系。

另一方面,在创建对象时从对象中删除这些属性似乎很繁琐,而且我不想更改解析器(水仙)。

有帮助吗?

解决方案

使用stringify的第二个参数替换功能,以排除已经序列化的对象: 通用标签

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

正如其他注释中正确指出的那样,此代码删除了每个“可见”对象,而不仅仅是“递归”对象。

例如,对于: 通用标签

结果将不正确。如果您的结构是这样的,则可能要使用Crockford的循环 a>或这个(简单的)函数,它将递归引用替换为null:

其他提示

我创建了一个GitHub Gist,它能够检测循环结构并对其进行反编码并进行编码:https://gist.github.com/Hoff97/9842228

要进行转换,只需使用JSONE.stringify / JSONE.parse。 它还对功能进行解编码。如果要禁用此功能,只需删除第32-48和61-85行即可。 通用标签

您可以在此处找到一个小提琴示例:

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

大量保护程序,它显示了 cycle 对象的位置。 通用标签

产生 通用标签

通用标签

缺少先决条件,否则数组对象中的整数值将被截断,即[[08.11.2014 12:30:13,1095]] 1095减少为095。

我也创建了一个github项目,该项目可以序列化循环对象并还原类(如果将其保存在String之类的serializename属性中) 通用标签

https://github.com/bormat/serializeStringifyParseCyclicObject

编辑: 我已经为NPM转换了脚本, https://github.com/bormat/borto_circular_serialize 函数名称从法语到英语。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top