繁体   English   中英

JSON.parse()中断对象功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM