Javascript JSON.stringify函数不起作用

HIL*_*EEN 12 javascript browser json javascript-engine

我试图将JS对象转换为JSON.

JSON.stringify({a:1, toJSON: function(){}})
Run Code Online (Sandbox Code Playgroud)

原生JSON stringify未按预期工作.JSON stringify在JS对象内部执行toJSON函数.我已经覆盖了如下的本机代码,

// Adding try catch for non JSON support browsers.
try{
 _jsonStringify = JSON.stringify;
 JSON.stringify = function(object){
    var fnCopy = object.toJSON; 
    object.toJSON = undefined;
    var result =  _jsonStringify(object);
    object.toJSON = fnCopy;
    return result;      
 };
}catch(e){}
Run Code Online (Sandbox Code Playgroud)

它工作正常.有没有其他更好的方法来做到这一点?在本机代码中是否有任何特定原因在输入对象中执行toJSON函数?

Dav*_*ret 12

这是因为如果存在,JSON.stringify将返回toJSON函数的返回值(Source).

例如:

JSON.stringify({a:1, toJSON: function(){ return "a"; }});
Run Code Online (Sandbox Code Playgroud)

将返回:

"a"
Run Code Online (Sandbox Code Playgroud)

MDN描述了此行为.这样做的原因是您可以自定义序列化的行为.例如,假设我只想Animal在此示例中序列化类的ID .我可以做以下事情:

var Animal = function(id, name) {
    this.AnimalID = id;
    this.Name     = name;
};

Animal.prototype.toJSON = function() {
    return this.AnimalID;
};

var animals = [];

animals.push(new Animal(1, "Giraffe"));
animals.push(new Animal(2, "Kangaroo"));

JSON.stringify(animals); // Outputs [1,2]
Run Code Online (Sandbox Code Playgroud)

如果您不想要这种行为,那么您当前的方法效果很好; 但是,我建议不要覆盖其中的行为JSON.stringify,而是将其他方法命名为其他方法.外部库可能正在使用toJSON对象中的函数,这可能会导致意外的结果.