序列化包含循环对象值的对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

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

我想序列化这个对象,JSON.stringify()但是我得到了:TypeError: cyclic object value因为我提到的构造。

我怎么能解决这个问题?对于其他节点的这些引用是否在序列化对象中表示或者不在序列中并不重要。

另一方面,在创建对象时从对象中移除这些属性似乎很乏味,我不想对解析器(narcissus)进行更改。

提问于
用户回答回答于

使用的第二个参数stringify,该替代品的功能,以排除已序列化对象:

var seen = [];

JSON.stringify(obj, function(key, val) {
   if (val != null && typeof val == "object") {
        if (seen.indexOf(val) >= 0) {
            return;
        }
        seen.push(val);
    }
    return val;
});

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

正如在其他评论中正确指出的那样,这段代码删除了每个“看到”的对象,而不仅仅是“递归的”对象。

例如,对于:

a = {x:1};
obj = [a, a];
用户回答回答于

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

转换只是使用JSONE.stringify / JSONE.parse。它还可以对函数进行解码和编码。如果你想禁用这个,只需删除第32-48行和第61-85行。

var strg = JSONE.stringify(cyclicObject);
var cycObject = JSONE.parse(strg);

你可以在这里找到一个例子:

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

扫码关注云+社区