【问题标题】:TypeError: Converting circular structure to JSON: Is there any way to ignore this warning?TypeError:将循环结构转换为 JSON:有什么方法可以忽略此警告吗?
【发布时间】:2013-08-11 18:20:03
【问题描述】:

我正在尝试发送一个复杂的数据结构,该结构由具有数组的对象组成,该数组具有具有对象的数组具有具有可能指向第一个对象的数组的对象,等等...我收到此错误:TypeError:将循环结构转换为 JSON,我完全理解它为什么会发生。

我试图避免扁平化结构,因为处理成本太高,所以我想知道在发送我的 http 请求(将其发送到 PHP 页面)时是否有任何其他方法可以简单地忽略此错误?

【问题讨论】:

标签: php javascript arrays json http


【解决方案1】:

不。 JSON 基本上是 JS 赋值操作的右侧。您不能在一行中构建自引用的 JS 结构,例如:

var x = {y : x };

在左侧实际创建之前,在右侧使用x 会简单地吐出一个“未定义”错误。

如果你不能用一行 JavaScript 来表达某些东西,那么你就不能用 JSON 来表达它。

【讨论】:

  • 如果我将 JSON 结构转换为数组会怎样?所以基本上它将是嵌套数组?
【解决方案2】:

您必须在某处拆分该圆形结构。

从 PHP 5.4 开始,有一个可用的接口JsonSerializable 允许对象在被json_encode() 询问时影响其 json 表示。

因此,您也许可以将其添加到您的引用对象中,以便仅在第一次被要求时返回子对象。或者更好的是,让那些引用该对象的对象不返回它,而是返回所有其他对象。

您可以尝试将该接口向后移植到 PHP 的早期版本,但您不仅需要该接口(这很简单),还需要一个替换函数 json_encode() 检测接口的存在并执行所有操作处理的东西。

您也可以尝试在对象中实现->toJson() 函数,以递归方式相互调用。

您可能已经尝试使用@json_encode() 抑制错误,不是吗?它会消除错误,但不会消除扁平圆形结构的痛苦。

【讨论】:

  • 我所做的是我保留了该对象的 id 的引用,而不是实际的对象。然后我保留了一个 HashMap,其中 id 是哈希键,这就是我直接快速访问每个此类对象的方式。
猜你喜欢
  • 2019-10-23
  • 1970-01-01
  • 2017-10-19
  • 2018-10-05
  • 2016-01-22
  • 2017-06-29
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多