亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

解決來自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 關注
  • 1258 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號