我正在尝试编写一个系统,其中客户端(基于浏览器)请求从服务器返回树(应用程序引擎,但这是无关紧要的)。问题在于将树转换为JSON:因为每个对象引用它下面的对象,当进行字符串化时,我最终会得到一个非常长的字符串,在解析时,它会为每个子节点创建新对象,而不是引用其他节点。
我目前的解决方案是编写'equalTo'和'toString'函数(将对象引用转换为字符串)stringify生成的数组,然后通过将字符串解析为对象在客户端重新创建它。这个解决方案让我的可怕算法感觉刺痛,但是,必须有更好的方法通过JSON返回这样的结构!
编辑:我刚刚想到对象引用也可以转换为数组索引。这是一个更好的解决方案,但仍然有那种令人尴尬的坏代码感觉。
EDIT2:是的,所以我想假设有一些伪代码,那么。
var node = {
children : null;
};
var root = Object.create(node);
var level1a = Object.create(node);
var level1b = Object.create(node);
var level2a = Object.create(node);
var level2b = Object.create(node);
root.children = [level1a, level1b];
level1a.children = [level2a, level2b];
所以你最终得到一棵看起来像这样的树: stackoverflow won't let me post images
答案 0 :(得分:0)
如果您有办法处理节点,可以使用JSON revivers and replacers在地址和引用之间进行转换。
例如,如果您有两个功能,如
function addressForNode(node) { ... }
function nodeForAddress(address) { ... }
你可以使用在解析或字符串化时调用它们的复活器和替换器
var jsonString = JSON.stringify(tree, function (key, value) {
if (typeof value === 'object') {
var address = addressForNode(value);
if (address !== null) { // value really is a node
return { address: address }
}
}
return value;
});
// And to parse...
var tree = JSON.parse(jsonString, function (key, value) {
if (typeof value === 'object' && typeof value.address === 'string') {
return nodeForAddress(value.address);
}
return value;
});
答案 1 :(得分:0)
如果您可以提供帮助,请不要将自己局限于JSON。相反,请考虑通过链接脚本生成包含JSONP技术的JavaScript代码。