无法将JSON对象作为请求参数发送,因为JSON.stringify会给出循环引用错误

时间:2012-10-10 10:33:39

标签: javascript jquery ajax json

我有一棵树,要显示在屏幕上,它基本上是一个JSON对象。我想将此JSON对象作为request参数发送到Java类。

以下是JSON对象的示例:

// Root node
var rootNode = { Content: "Root", Nodes:[] };
// First Level
rootNode.Nodes[0] = { Content: "Employee Code", navigationType: "0"};
rootNode.Nodes[1] = { Content: "Problem Area", navigationType: "1" };
// Second Level
rootNode.Nodes[1].Nodes = [{ Content : "ACC-HO", Collapsed: true},
                           { Content : "ACC-SALES" },
                           { Content : "BUSI. HEAD", ToolTip: "Click ME!" },
                           { Content : "CEO"}
                          ];

现在,插件(从JSON对象创建此树)在每个节点中存储Parent节点的引用。因此,这会产生circular reference,其中节点存储其子节点的引用,并且每个子节点存储其父节点的引用

由于这个原因,我unable to use JSON.stringify(rootNode)

我想使用Ajax将rootNode对象作为请求参数发送。我做了以下事情:

$.ajax({
    type : "POST",
    url : "treeDemo_!saveTree",
            data: {treeObject: JSON.stringify(rootNode) },
            success : function(resp) {      
        alert('success');
    }
});

但正如我所提到的,JSON.stringify在我的情况下不起作用。那么有人可以建议另一种方法将JSON对象作为请求参数发送,我可以在Java代码中接收并进一步处理吗?

1 个答案:

答案 0 :(得分:0)

如果无法清除插件,解决方法是克隆rootNode对象,并且在此过程中不要复制“Parent”属性:

function goclone(source) {
    if (Object.prototype.toString.call(source) === '[object Array]') {
        var clone = [];
        for (var i=0; i<source.length; i++) {
            clone[i] = goclone(source[i]);
        }
        return clone;
    } else if (typeof(source)=="object") {
        var clone = {};
        for (var prop in source) {
            if (source.hasOwnProperty(prop) && prop!='Parent') {
                clone[prop] = goclone(source[prop]);
            }
        }
        return clone;
    } else {
        return source;
    }
}

var serializableRootNode = goclone(rootNode);

serializableRootNode不包含'Parent'属性。

如果父引用未被称为'Parent',则调整代码。