【问题标题】:Is there a way to prevent JSON.stringify from calling toJSON?有没有办法阻止 JSON.stringify 调用 toJSON?
【发布时间】:2017-03-20 13:09:11
【问题描述】:

JSON.stringify 有一个特性,通过定义一个名为 toJSON 的函数,使对象能够定义自己的序列化。

这是 MDN 文档的摘录:

toJSON() 行为

如果一个被字符串化的对象有一个名为 toJSON 的属性,它的值 是一个函数,那么 toJSON() 方法自定义 JSON 字符串化行为:不是被序列化的对象,而是 toJSON()方法调用时返回的值会被序列化。

有没有办法覆盖它,这样即使附加了 toJSON 方法,它也会忽略它们并进行“正常”序列化?

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

所以,我无法删除有问题的方法,但是我想提示 JSON.stringify 忽略这些方法。

【问题讨论】:

标签: javascript json serialization


【解决方案1】:

您可以覆盖该方法:

var fn = JSON.stringify;

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

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

【讨论】:

  • 谢谢.. 看起来很有希望。我试试看
  • 注意如果toJSON 定义在Array.prototype.toJSON 这样的原型上,它就不起作用。你也需要在这里删除它。
  • @SébastienDeprez 我编辑了代码以反映该注释,因为我也发现了继承问题。
【解决方案2】:

如果您将对象中的 toJSON 属性设为 null,它将恢复为默认行为

obj.toJSON = null;

如果你不想修改你的对象,你可以在之前复制它

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

【讨论】:

  • null 的值也是序列化的,最好使用undefined。这取决于如何将此方法附加到对象。对象可能被冻结,属性可能是writable:falseconfigurable:false,也许还有更多的可能性来禁用覆盖方法。
猜你喜欢
  • 1970-01-01
  • 2014-09-05
  • 2019-10-20
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多