我有一个包含循环引用的JavaScript对象定义:它具有一个引用父对象的属性。
它还具有一些我不想传递给服务器的功能。我将如何序列化和反序列化这些对象?
我读过,做到这一点的最好方法是使用道格拉斯·克罗克福德的stringify。但是,我在Chrome中遇到以下错误:
TypeError:将圆形结构转换为JSON
编码:
function finger(xid, xparent){
this.id = xid;
this.xparent;
//other attributes
}
function arm(xid, xparent){
this.id = xid;
this.parent = xparent;
this.fingers = [];
//other attributes
this.moveArm = function() {
//moveArm function details - not included in this testcase
alert("moveArm Executed");
}
}
function person(xid, xparent, xname){
this.id = xid;
this.parent = xparent;
this.name = xname
this.arms = []
this.createArms = function () {
this.arms[this.arms.length] = new arm(this.id, this);
}
}
function group(xid, xparent){
this.id = xid;
this.parent = xparent;
this.people = [];
that = this;
this.createPerson = function () {
this.people[this.people.length] = new person(this.people.length, this, "someName");
//other commands
}
this.saveGroup = function () {
alert(JSON.stringify(that.people));
}
}
这是我为这个问题创建的测试用例。这段代码中有错误,但是本质上我在对象中有对象,并且传递给每个对象以显示创建对象时父对象是什么的引用。每个对象还包含一些函数,我不想对其进行字符串化。我只想要的属性Person.Name
。
假设传递回相同的JSON,如何在发送到服务器之前进行序列化和反序列化?
*当您拥有对象的属性时,如果对象本身是直接(a -> a
)或间接(a -> b -> a
)的属性,则会发生 *圆形结构 错误。
为避免错误消息,请告诉JSON.stringify遇到循环引用时该怎么做。例如,如果您有一个人指向另一个人(“父母”),它可能(也可能不)指向原始人,请执行以下操作:
JSON.stringify( that.person, function( key, value) {
if( key == 'parent') { return value.id;}
else {return value;}
})
to的第二个参数stringify
是 过滤器函数 。在这里,它只是将引用的对象转换为其ID,但是您可以随意做任何破坏循环引用的操作。
您可以使用以下代码测试以上代码:
function Person( params) {
this.id = params['id'];
this.name = params['name'];
this.father = null;
this.fingers = [];
// etc.
}
var me = new Person({ id: 1, name: 'Luke'});
var him = new Person( { id:2, name: 'Darth Vader'});
me.father = him;
JSON.stringify(me); // so far so good
him.father = me; // time travel assumed :-)
JSON.stringify(me); // "TypeError: Converting circular structure to JSON"
// But this should do the job:
JSON.stringify(me, function( key, value) {
if(key == 'father') {
return value.id;
} else {
return value;
};
});
顺便说一句,我会为“ parent
” 选择一个不同的属性名称,因为它是许多语言(和DOM)中的保留字。这往往会引起混乱。
我有一个包含循环引用的JavaScript对象定义:它有一个引用父对象的属性。 它还有一些我不想传递给服务器的函数。如何序列化和反序列化这些对象? 我读过这样做的最好方法是使用Douglas Crockford的stringify。但是,我在Chrome中遇到以下错误: 将圆形结构转换为JSON 守则: 这是我为这个问题创建的测试用例。这段代码中有一些错误,但基本上我在对象中有对象,并向每个对象传
问题内容: 因此,我得到了以下javascript,其中包含键/值对,用于将嵌套路径映射到目录。 现在,我要做的是根据地图中的键创建一个JSON对象。 它一定要是, 不知道是否有开箱即用的方式来执行此操作。任何帮助表示赞赏。 问题答案: 您可以在地图和键上循环并分配值
问题内容: 我有一个简单的csv文件 people.csv: 我想要做的是获取CSV的每一行,将其转换为JavaScript对象,将其存储到数组中,然后将数组转换为JSON对象。 server.js: 我的问题是,当我在bufferString上调用.split(’\ n’)方法时,是否实际上是将CSV行转换为Javascript对象,还是有另一种方法? 问题答案: 通过做这个: 您将拥有一个包含
问题内容: 我想在本地保存具有循环引用的对象。我有什么选择? 我的第一个想法是使用HTML5本地存储,但是由于循环引用,我无法对该对象进行字符串化。 具体来说,我正在尝试保存当前选择的DOMSelection对象。 例: 我现在可以使字符串化工作的唯一方法是忽略某些对象,如下所示: 但这给我留下了一个相当空的DOMSelection对象,不足以满足我的需要。 还有其他方法可以保存该对象吗?唯一的要
问题内容: 如果我从json.net获得序列化的JSON,如下所示: 我想让淘汰赛在FooList上输出foreach,但是我不确定如何继续,因为$ ref东西可能会抛出东西。 我在想解决方案将以某种方式通过不使用以下方式强制将所有Foos呈现在FooList中: 但这似乎很浪费。 问题答案: 从服务器接收的json对象包含循环引用。在使用对象之前,您必须首先 从对象中删除所有属性,这意味着`$r
问题内容: 我有一个像这样创建的数组或javascript对象: 其中obj是像这样 的经典JSON字符串。 因此似乎是一个JavaScript对象数组。 我可以这样访问它: ,。甚至可能像 如果我这样做:alert(JSON.stringify(arr)); 我得到以下内容: 而警报(警报);给我类似的东西: 现在,我需要使用jQuery的AJAX方法将其传递给PHP脚本。但是似乎只能得到组合字