[英]JSON.parse() breaks object function
我有一些对象用JSON.stringify()'进行字符串化',然后用localstorage.setItem()保存,然后用localstorage.getItem()检索,然后用JSON.parse()解析,最后返回到程序中使用的对象数组。 这是我的代码:
var exampleObjects = [];
function objectExample() {
this.exampleFunction = function() {
return this.otherObjectCreatedElsewhere.value;
}
this.otherObjectCreatedElsewhere;
}
function main() {
exampleObjects[ 0 ] = new objectExample();
exampleObjects[ 0 ].otherObjectCreatedElsewhere = otherObjectCreatedElsewhere;
exampleObjects[ 0 ].exampleFunction(); //Works
var save0 = JSON.stringify( exampleObjects[ 0 ] );
localstorage.setItem( 'key', save0 );
save0 = localstorage.getItem( 'key' );
exampleObjects[ 0 ] = JSON.parse( save0 );
exampleObjects[ 0 ].exampleFunction(); //No longer works, instead throws error exampleObjects[ 0 ].exampleFunction is not a function
}
main();
现在,我已经使用reviver方法查询了JSON.parse,但是我一生都无法发现它。 我还没有上过这件事,这只是我的一个爱好,但是我已经培养了几年。 我真的很喜欢,但是这样的时代令人沮丧。
编辑
我已经用cloudfeet的宝贵建议解决了这个问题。 基本上,我从保存的JSON字符串中获取对象,然后将它们解析为对象,然后创建一个新对象并重新分配所有丰富的属性。
再次感谢!
JSON不是JavaScript。 它使用JavaScript语法的有限子集,但它只能编码的数据类型是:
(请参阅http://json.org/ )
JSON 无法序列化功能。 任何函数都将被忽略(如undefined
),原型将被破坏,等等。
所以:您需要做的就是将您的丰富对象(带有方法等)转换为JSON,然后能够再次转换。
编辑:一个粗糙的例子:
function MyObj(name, age) {
this.name = name;
this.age = age;
this.hello = function () {
alert('Hello, ' + this.name + '!');
};
}
序列化时,将得到{"name": "Sarah", "age": 38}
-没有"hello"
条目。
因此,要解码,您需要将其解压缩:
var array = JSON.parse(savedString); // Plain JSON
for (var i = 0; i < array.length; i++) {
var plainObj = array[i];
var richObj = new MyObj(plainObj.name, plainObj.age); // reconstruct
array[i] = richObj;
}
这是一种简单的方法,采用了硬编码的解码逻辑-有多种方法可以使其变得更奇特 ,例如JSON.stringify()和JSON.parse()的第二个参数,以及.toJSON()方法,但大致同一件事,组织方式不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.