【问题标题】:how to stringify circular JSON object?如何对圆形 JSON 对象进行字符串化?
【发布时间】:2015-01-14 03:43:27
【问题描述】:

是否有可以对复杂 JSON 对象进行字符串化的内置方法?

每次我使用 JSON.stringfy 时都会收到此错误:Converting circular structure to JSON,而且我还需要它的解析器

这是我的对象的图像 http://imgur.com/s3HbdtQ

【问题讨论】:

  • jquery json to string?的可能重复
  • JSON.stringify 内置方法,至少在现代浏览器中是这样。您可以发布您尝试字符串化的 JSON 吗?
  • JSON 是一个特定形状的字符串。您正在尝试对 JavaScript 对象进行字符串化,而不是 JSON。
  • 这可能是这个问题的重复:stackoverflow.com/questions/13861254/…
  • 每次使用 JSON.stringify 时都会出现错误?试试JSON.stringify(99)。如果这是您的旧字符串化 DOM 问题,请确保在尝试字符串化之前使用 outerHTML,如另一个问题的答案中所述。

标签: javascript json


【解决方案1】:

您无法将循环结构完全转换为 JSON:没有什么可以描述那些不能在有限时间内转储的关系。

替代方案:

  • 使用 JSON 以外的其他格式(例如,Armadan 建议的 YAML
  • 使用额外的 JSON 兼容语法扩展 JSON 以描述参考
  • 使用删除循环引用的库(生成一些 JSON,但没有无法字符串化的内容)。我做了这样一个库:https://github.com/Canop/JSON.prune

【讨论】:

  • 您也可以使用其中一个 YAML 库; YAML 与 JSON 不同,允许循环表示。
  • 转换前这是我的对象:imgur.com/s3HbdtQ,转换后是:imgur.com/ilWUGcU 我跳过了出现的错误,但这个库也跳过了一些对我很重要的数据
  • @MuhammedAbdEl-Wadod 你会期待什么?如果您想恢复您的对象,请使用支持循环引用(例如 YAML)而不是 JSON 的序列化格式。
  • 我想对 JSON 进行字符串化以将其存储在 sessionsttorage 并在刷新浏览器后我想从 sessionsttorage 中取回它,并且该对象创建于运行时间和每次我不知道这个对象会携带什么
  • 并且 YAML 是 node.js,我不能在应用程序中使用它
【解决方案2】:

看看这个小图书馆:

https://github.com/WebReflection/circular-json

它将包含循环引用的其他有效 JSON 对象序列化和反序列化到和从专用 JSON 格式转换。

【讨论】:

  • 此答案需要更多信息
【解决方案3】:

我推荐Flatted。它很小,而且效果很好。 它的缩小版重 1KB。

这是他们文档中的一个示例。

var a = [{one: 1}, {two: '2'}];
a[0].a = a;
// a is the main object, will be at index '0'
// {one: 1} is the second object, index '1'
// {two: '2'} the third, in '2', and it has a string
// which will be found at index '3'

Flatted.stringify(a);
// [["1","2"],{"one":1,"a":"0"},{"two":"3"},"2"]

然后它可以在必要时将字符串化结果解析回来并重建循环引用。

var a = [{one: 1}, {two: '2'}]
a[0].a = a
Flatted.stringify(a)
var a1 = Flatted.stringify(a)
var a2 = Flatted.parse(a1)

【讨论】:

    【解决方案4】:

    标准和最佳的解决方案是json-stringify-safe 模块。

    这是用法(在模块中描述):

    var stringify = require('json-stringify-safe');
    var circularObj = {};
    circularObj.circularRef = circularObj;
    circularObj.list = [ circularObj, circularObj ];
    console.log(stringify(circularObj, null, 2));
    
    // Output:
    
    {
      "circularRef": "[Circular]",
      "list": [
        "[Circular]",
        "[Circular]"
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 2012-07-17
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多