3 回答

TA貢獻1998條經(jīng)驗 獲得超6個贊
您從服務(wù)器接收的json對象包含循環(huán)引用。在使用該對象之前,您必須首先$ref從該對象中刪除所有屬性,這意味著$ref : "1"必須放置該鏈接指向的對象來代替該對象。
您的情況可能是指向ID為1的用戶對象
為此,您應(yīng)該在github上查看Douglas Crockfords插件。有一個cycle.js可以為您完成工作。
或者您可以使用以下代碼(未經(jīng)測試):
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;
}
讓我知道是否有幫助!

TA貢獻1852條經(jīng)驗 獲得超1個贊
如果您利用JSON.parse的reviver參數(shù),這實際上非常簡單。
下面的例子。請參閱瀏覽器控制臺以獲取輸出,因為StackOverflow的代碼段控制臺輸出將無法提供有關(guān)結(jié)果的準確圖片。
// 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));
添加回答
舉報