【问题标题】:"Uncaught TypeError: Converting circular structure to JSON" -- Alternatives to JSON.stringify()?“未捕获的 TypeError:将循环结构转换为 JSON”—— JSON.stringify() 的替代方案?
【发布时间】:2014-08-15 17:41:19
【问题描述】:

我正在使用一个库 Instafeed,它创建了一个 feed 对象。 feed 对象相当复杂。

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

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

有没有其他方法可以序列化这个对象以避免循环引用错误?


编辑

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

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

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

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


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

Uncaught RangeError: Maximum call stack size exceeded 

【问题讨论】:

  • 可能。您希望如何表示循环引用?
  • 你在用这个提要做什么?您绝对需要将所有内容序列化吗?如果没有,您可以改用分页,这在 Instafeed 网站上有所提及。
  • @BenSmith 我实际上是在尝试通过 websockets 发送提要对象本身,所以是的。还有其他方法可以实现更大的目标,但直接通过它是最简单的。
  • @FelixKling 我不明白这个问题。我想代表它无论如何我可以让它序列化。
  • 循环引用没有灵丹妙药。通常,您必须考虑是什么使对象具有唯一性,然后将该信息用作值而不是对象本身。但是,在您的情况下,context 似乎只是引用了对象本身。如果您可以假设情况总是如此,那么只需将其设置为例如 null 或删除该属性。

标签: javascript json serialization


【解决方案1】:

检查https://github.com/stevenschobert/instafeed.js/blob/master/src/instafeed.coffee,看起来context 属性有时(但并非总是)是循环引用。保证不存在的一件事是null

在序列化时测试循环引用,如果找到,将其序列化为空。通过重新循环来反序列化另一端。

(这只是对特定情况的回答,而不是一般情况的答案 - 这个对象有很好的优点是立即循环。多步圆会更复杂)

【讨论】:

    【解决方案2】:

    JSON 是一种数据格式,不是保存任意 JavaScript 对象的方法。因此,尝试通过 JSON 在网络上推送不仅仅是数据的 JS 对象听起来令人担忧。您可能会考虑您的设计是否可以仅移动您实际需要移动的信息。

    也就是说,看起来至少有一个人试图解决循环引用问题in library form

    【讨论】:

      【解决方案3】:

      如果您正在寻找替代品,您应该查看Circular JSON package

      将您对JSON 的呼叫替换为CircularJSON

      function MyCircularClass() {
        this.circular = this;
      }
      
      var obj = new MyCircularClass();
      var objSerialized = CircularJSON(obj);
      
      console.log(obj);
      // ouputs '{ "ciruclar": "~" }'
      

      【讨论】:

        【解决方案4】:

        这是你的灵丹妙药:cycle.js。如果您使用的是 npm,也可以使用 as a package

        您可以使用它来解除对象的循环,以便对其进行序列化:

        var stringForm = JSON.stringify(cycle.decycle(myObject));
        

        稍后,如果您将对象重新加载到 javascript 中,您可以使用以下命令再次循环:

        cycle.retrocycle(JSON.parse(stringForm));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-22
          • 1970-01-01
          • 1970-01-01
          • 2021-01-12
          • 2014-01-21
          • 1970-01-01
          • 1970-01-01
          • 2017-06-29
          相关资源
          最近更新 更多