“Uncaught TypeError:将循环结构转换为JSON” - JSON.stringify()的替代方案?

时间:2014-08-15 17:41:20

标签: javascript json serialization

我使用的是Instafeed库,它创建了一个feed对象。 feed对象非常复杂。

我需要将此对象转换为字符串值以进行传输。

问题是,我得到了Uncaught TypeError: Converting circular structure to JSON。我遇到的所有答案都说要改变对象以摆脱循环引用。但是,该对象非常复杂,我宁愿不必这样做。

是否有其他方法可以序列化此对象以避免循环引用错误?


修改

实际上,我正在查看控制台中的对象,我看到了:

enter image description here

我将context键扩展了30次,它一直在继续。我没有内存问题,并且Feed确实运行正常,因为加载图像是唯一的延迟,所以看起来这个库不会创建嵌套元素的无限循环。

  • 这只是对象如何显示的特性而不是对象本身结构的指示吗?

  • 我如何序列化这样的东西?


另外,我尝试了JSON-to-XML plugin,但在转换时我收到了以下错误:

Uncaught RangeError: Maximum call stack size exceeded 

4 个答案:

答案 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));