解析来自 JSON 对象的循环引用 [英] Resolve circular references from JSON object
问题描述
如果我有一个来自 json.net 的序列化 JSON,就像这样:
If I have a serialized JSON from json.net like so:
User:{id:1,{Foo{id:1,prop:1}},
FooList{$ref: "1",Foo{id:2,prop:13}}
我想在 FooList 上输出一个 foreach,但我不知道如何继续,因为 $ref 的东西可能会抛出东西.
I want to have knockout output a foreach over FooList but I am not sure how to proceed because the $ref things could throw things.
我认为解决方案是通过不使用以某种方式强制所有 Foo 在 FooList 中呈现:
I'm thinking the solution would be to somehow force all the Foos to be rendered in the FooList by not using:
PreserveReferencesHandling = PreserveReferencesHandling.Objects
但这似乎很浪费..
推荐答案
您从服务器接收的 json 对象包含 循环引用.在使用对象之前,您应该首先从对象中删除所有 $ref
属性,这意味着代替 $ref : "1"
您必须将对象放在这个链接点.
The json object which you are receiving from the server contains Circular References. Before using the object you should have to first remove all the $ref
properties from the object, means in place of $ref : "1"
you have to put the object which this link points.
在您的情况下,它可能指向 id 为 1 的用户对象
为此,您应该查看 github 上的 Douglas Crockfords 插件.有一个 cycle.js 可以完成这项工作给你.
For this you should check out Douglas Crockfords Plugin on github.There is a cycle.js which can do the job for you.
或者您可以使用以下代码(未测试):
or you can use the following code (not tested) :
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;
}
如果有帮助,请告诉我!
Let me know if it helps !
这篇关于解析来自 JSON 对象的循环引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!