当前位置: 首页 > 面试题库 >

解决JSON对象的循环引用

赫连鸿振
2023-03-14
问题内容

如果我从json.net获得序列化的JSON,如下所示:

User:{id:1,{Foo{id:1,prop:1}},
FooList{$ref: "1",Foo{id:2,prop:13}}

我想让淘汰赛在FooList上输出foreach,但是我不确定如何继续,因为$ ref东西可能会抛出东西。

我在想解决方案将以某种方式通过不使用以下方式强制将所有Foos呈现在FooList中:

PreserveReferencesHandling = PreserveReferencesHandling.Objects

但这似乎很浪费。


问题答案:
从服务器接收的json对象包含循环引用。在使用对象之前,您必须首先 $ref从对象中删除所有属性,这意味着`$ref
“1”`必须放置此链接指向的对象来代替您。

在您的情况下,它可能指向id为1的User对象

为此,您应该在github上查看DouglasCrockfords插件。有一个cycle.js可以为您完成工作。

或者您可以使用以下代码(未经测试):

function resolveReferences(json) {
    if (typeof json === 'string')
        json = JSON.parse(json);

    var byid = {}, // all objects by id
        refs = []; // references to objects that could not be resolved
    json = (function recurse(obj, prop, parent) {
        if (typeof obj !== 'object' || !obj) // a primitive value
            return obj;
        if ("$ref" in obj) { // a reference
            var ref = obj.$ref;
            if (ref in byid)
                return byid[ref];
            // else we have to make it lazy:
            refs.push([parent, prop, ref]);
            return;
        } else if ("$id" in obj) {
            var id = obj.$id;
            delete obj.$id;
            if ("$values" in obj) // an array
                obj = obj.$values.map(recurse);
            else // a plain object
                for (var prop in obj)
                    obj[prop] = recurse(obj[prop], prop, obj)
            byid[id] = obj;
        }
        return obj;
    })(json); // run it!

    for (var i=0; i<refs.length; i++) { // resolve previously unknown references
        var ref = refs[i];
        ref[0][ref[1]] = byid[refs[2]];
        // Notice that this throws if you put in a reference at top-level
    }
    return json;
}

让我知道是否有帮助!



 类似资料:
  • 问题内容: 下面的每个示例…从解析的JSON字符串遍历对象将返回错误“对象不支持此属性或方法”。谁能建议如何进行这项工作?非常感谢(我花了6个小时在这里问一个答案)。 将JSON字符串解析为对象的函数(可以正常运行)。 循环遍历已解析的对象将返回错误“对象不支持此属性或方法”。 PS。我已经研究了这些库: - VBA的JSON无法获得的例子工作。 - VBJSON有没有包括VBA脚本(这可能工作,

  • 问题内容: 有岗位这里,询问如何通过返回EF4CTP5序列化对象时,解决循环引用错误。不久前,我在WCF Web表单项目中遇到了同样的问题。 我能够在WCF / Web窗体项目和MVC3项目中“解决”此问题。我认为什么类型的项目都不重要,因为这似乎是EF序列化的“事物”。 我通过在ObjectContext构造函数中禁用ProxyCreation来解决此问题,如下所示: 我的问题是:有人可以解释为

  • 本文向大家介绍详解Struts2中json 相互引用死循环解决办法,包括了详解Struts2中json 相互引用死循环解决办法的使用技巧和注意事项,需要的朋友参考一下 方法1 :利用Struts 2的支持的可配置结果,可以达到过滤器的效果。Action的处理结果配置支持正则表达式。 但是如果返回的对象是一个数组格式的Json数据。比如peson Bean中有对象persion1…person9,而

  • 我有一个包含循环引用的JavaScript对象定义:它有一个引用父对象的属性。 它还有一些我不想传递给服务器的函数。如何序列化和反序列化这些对象? 我读过这样做的最好方法是使用Douglas Crockford的stringify。但是,我在Chrome中遇到以下错误: 将圆形结构转换为JSON 守则: 这是我为这个问题创建的测试用例。这段代码中有一些错误,但基本上我在对象中有对象,并向每个对象传

  • 问题内容: 所以这是我的交易 楷模 ....以下模型(这些模型已连接到EfDbContext)已连接到以下存储库… 接口/存储库 在我的HomeController()中,我得到了一个JsonResult方法,我想返回上下文。这是方法 杰森请求 我收到以下错误: 序列化类型为’System.Data.Entity.DynamicProxies.News_96C0B16EC4AC46070505EE

  • 问题内容: 我有一个包含循环引用的JavaScript对象定义:它具有一个引用父对象的属性。 它还具有一些我不想传递给服务器的功能。我将如何序列化和反序列化这些对象? 我读过,做到这一点的最好方法是使用道格拉斯·克罗克福德的stringify。但是,我在Chrome中遇到以下错误: TypeError:将圆形结构转换为JSON 编码: 这是我为这个问题创建的测试用例。这段代码中有错误,但是本质上我