Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法阻止JSON.stringify调用toJSON?_Javascript_Json_Serialization - Fatal编程技术网

Javascript 有没有办法阻止JSON.stringify调用toJSON?

Javascript 有没有办法阻止JSON.stringify调用toJSON?,javascript,json,serialization,Javascript,Json,Serialization,stringify有一个功能,通过定义一个名为toJSON的函数,使对象能够定义自己的序列化 以下是MDN文档的摘录: toJSON()行为 如果正在字符串化的对象具有名为toJSON的属性,其值为 是一个函数,则toJSON()方法自定义JSON 字符串化行为:不是序列化对象,而是 调用toJSON()方法时返回的值将被序列化 有没有一种方法可以覆盖它,这样即使附加了toJSON方法,它也会忽略它们并执行“正常”序列化 原因:由于一个JS库,在我的环境中引入了一些toJson方法,它们有一些小

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

以下是MDN文档的摘录:

toJSON()行为

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

有没有一种方法可以覆盖它,这样即使附加了toJSON方法,它也会忽略它们并执行“正常”序列化

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


因此,我无法删除错误的方法,但是我想提示JSON.stringify忽略这些方法。

如果在对象中为
toJSON
属性设置空值,它将返回默认行为

obj.toJSON = null;
如果你不想修改你的对象,你可以在修改之前复制它

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

您可以覆盖该方法:

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;
};

我不打算将此作为答案发布,因为我甚至为尝试过此方法而感到羞愧,但您可以重写此方法:
null
值也被序列化,最好使用
未定义的
。这取决于该方法如何附加到对象。对象可能被冻结,属性可能是
可写:false
可配置:false
,并且可能还有一些禁用覆盖方法的可能性。谢谢。。看起来很有希望。我将尝试使用它。如果在原型上定义了
toJSON
,如
Array.prototype.toJSON
,请注意它不起作用。您也需要在此处删除它。@SébastienDeprez我编辑代码以反映该注释,因为我也发现了继承问题。