2017-03-20 38 views
0

JSON.stringify有一个功能,通过定义名称为JSON的函数来使对象能够定义自己的序列化。有没有办法阻止JSON.stringify调用toJSON?

下面是从MDN文档的摘录:

的toJSON()行为

如果正在字符串化的对象有一个名为的toJSON其值 是一个函数属性,则的toJSON()方法定制JSON 字符串化行为:而不是被序列化的对象,被调用的toJSON()方法返回的值将被序列化。

有没有办法重写它,以便即使有附加的JSON方法,它会忽略它们并执行'正常'序列化?

原因:有一些toJson方法,由于JS库在我的环境中引入了一些小错误。其中一些有问题的序列化格式已被接受,服务器端被编码为该格式。

所以,我坚持不能删除错误的方法,但是我想提示JSON.stringify忽略那些前进的方法。

+1

不打算张贴此作为一个答案,因为我很惭愧具有甚至试图这个,但是你可以重写这个方法:https://jsfiddle.net/TheQueue841/6ynwmy5t/ –

回答

1

您可以覆盖方法:

var fn = JSON.stringify; 

JSON.stringify = function (o) { 
    var tmp, toJSON;  

    if(o.toJSON){ 
    toJSON = o.toJSON; 
    delete o.toJSON;  
    } 
    tmp = fn.apply(this, arguments); 
    toJSON && (o.toJSON = toJSON); 
    return tmp; 
}; 
+0

谢谢..它看起来很有希望。我会尝试一下 – Teddy

1

如果空在你的对象toJSON属性会回到默认行为

obj.toJSON = null; 

如果你不想修改你的对象,你可以做一个副本

var copy = Object.assign({}, obj); 
obj.toJSON = null; 
+1

'null'值也被序列化,最好使用'undefined'。这取决于如何将此方法连接到对象。对象可能被冻结,该属性可能是'writable:false'或'configurable:false',并且可能有更多的可能性来禁用覆盖该方法。 – Thomas

相关问题