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对象中的函数,这可能会导致意外的结果.
| 归档时间: |
|
| 查看次数: |
37670 次 |
| 最近记录: |