为了账号安全,请及时绑定邮箱和手机立即绑定

解决来自JSON对象的循环引用

解决来自JSON对象的循环引用

慕侠2389804 2019-11-18 14:57:09
如果我从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但这似乎很浪费。
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

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


您的情况可能是指向ID为1的用户对象


为此,您应该在github上查看Douglas Crockfords插件。有一个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;

}  

让我知道是否有帮助!


查看完整回答
反对 回复 2019-11-18
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

如果您利用JSON.parse的reviver参数,这实际上非常简单。


下面的例子。请参阅浏览器控制台以获取输出,因为StackOverflow的代码段控制台输出将无法提供有关结果的准确图片。


// example JSON

var j = '{"$id":"0","name":"Parent","child":{"$id":"1", "name":"Child","parent":{"$ref":"0"}},"nullValue":null}'


function parseAndResolve(json) {

    var refMap = {};


    return JSON.parse(json, function (key, value) {

        if (key === '$id') { 

            refMap[value] = this;

            // return undefined so that the property is deleted

            return void(0);

        }


        if (value && value.$ref) { return refMap[value.$ref]; }


        return value; 

    });

}


console.log(parseAndResolve(j));


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 1174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信