我使用的是Instafeed库,它创建了一个feed
对象。 feed
对象非常复杂。
我需要将此对象转换为字符串值以进行传输。
问题是,我得到了Uncaught TypeError: Converting circular structure to JSON
。我遇到的所有答案都说要改变对象以摆脱循环引用。但是,该对象非常复杂,我宁愿不必这样做。
是否有其他方法可以序列化此对象以避免循环引用错误?
修改
实际上,我正在查看控制台中的对象,我看到了:
我将context
键扩展了30次,它一直在继续。我没有内存问题,并且Feed确实运行正常,因为加载图像是唯一的延迟,所以看起来这个库不会创建嵌套元素的无限循环。
这只是对象如何显示的特性而不是对象本身结构的指示吗?
我如何序列化这样的东西?
另外,我尝试了JSON-to-XML plugin,但在转换时我收到了以下错误:
Uncaught RangeError: Maximum call stack size exceeded
答案 0 :(得分:2)
检查https://github.com/stevenschobert/instafeed.js/blob/master/src/instafeed.coffee,看起来context
属性有时(但不总是)是循环引用。保证一件事情不是null
。
在序列化时测试循环引用,如果找到,则将其序列化为null。另一方面通过重新循环来反序列化。
(这只是对特定情况的回答,而不是一般情况 - 这个对象有很好的优雅,立即循环。多步循环会相当复杂)
答案 1 :(得分:0)
JSON是一种数据格式,而不是保存任意JavaScript对象的方法。所以试图通过JSON推送一个不仅仅是通过网络数据的JS对象听起来很有趣。您可能会考虑您的设计是否只能移动您实际需要移动的信息。
那就是说,看起来至少有一个人试图解决循环引用问题in library form。
答案 2 :(得分:0)
如果您专门寻找替代方案,则应查看Circular JSON package。
将来自JSON
的来电替换为CircularJSON
:
function MyCircularClass() {
this.circular = this;
}
var obj = new MyCircularClass();
var objSerialized = CircularJSON(obj);
console.log(obj);
// ouputs '{ "ciruclar": "~" }'
答案 3 :(得分:0)
这是你的银弹:cycle.js。如果您正在使用npm,它也可用as a package。
您可以使用它来解除对象的循环,以便可以使用以下命令对其进行序列化:
var stringForm = JSON.stringify(cycle.decycle(myObject));
稍后,如果您将对象加载回javascript,则可以使用以下命令重新循环:
cycle.retrocycle(JSON.parse(stringForm));