在JSON中存储树结构

时间:2011-05-12 18:34:33

标签: javascript json tree

我正在尝试编写一个系统,其中客户端(基于浏览器)请求从服务器返回树(应用程序引擎,但这是无关紧要的)。问题在于将树转换为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

2 个答案:

答案 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代码。