我试图将JS对象转换为JSON。
JSON.stringify({a:1, toJSON: function(){}})
Native 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){}
工作正常。有没有其他更好的方法来做到这一点?本机代码中是否有任何特定原因在输入对象中执行 toJSON 函数?
答案 0 :(得分:11)
这是因为JSON.stringify
将返回toJSON
函数的返回值(如果它存在(Source)。
例如:
JSON.stringify({a:1, toJSON: function(){ return "a"; }});
将返回:
"a"
此行为为described on 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]
如果您不想要这种行为,那么您当前的方法效果很好;但是,我建议不要覆盖JSON.stringify
的行为,而是将您的方法命名为其他内容。外部库可能正在使用对象中的toJSON
函数,这可能会导致意外结果。
答案 1 :(得分:0)
原生JSON.stringify
无法正常工作的原因是因为它无法对字符串化功能。通过将唯一函数toJSON
设置为undefined,JSON.stringify返回正确的值。有关详细信息,请参阅此问题:JSON.stringify function
如果您尝试完全删除功能,可以执行以下操作:
JSON.stringify(object, function(key, value) {
if (typeof value === "function") {
return undefined;
}
return value;
});
答案 2 :(得分:-1)
JSON.stringify
函数通常使用一个参数调用,该参数是您要序列化为JSON字符串的对象。我相信还有第二个可选参数,它是一个替换一个或多个属性的函数。序列化的方式。
但是,您应不将函数添加为对象的第二个属性!
在Chrome控制台中尝试以下操作时:
JSON.stringify({a:1,b:'hello'})
结果如下:
"{"a":1,"b":"hello"}"