14

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

JSON.stringify({a:1, toJSON: function(){}})

本机 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函数?

4

3 回答 3

13

这是因为如果函数存在(SourceJSON.stringify将返回函数的返回值。toJSON

例如:

JSON.stringify({a:1, toJSON: function(){ return "a"; }});

将返回:

"a"

此行为在 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对象中的函数,这可能会导致意外结果。

于 2014-05-27T19:38:29.077 回答
0

本机JSON.stringify不起作用的原因是它不能对函数进行字符串化。通过将唯一的函数 , 设置toJSON为未定义,JSON.stringify 返回正确的值。有关更多详细信息,请参阅此问题:JSON.stringify 函数

如果您尝试完全删除函数,您可以这样做:

JSON.stringify(object, function(key, value) {
  if (typeof value === "function") {
    return undefined;
  }
  return value;
});
于 2014-05-27T18:51:02.397 回答
-2

JSON.stringify函数通常使用一个参数调用,即您要序列化为 JSON 字符串的对象。我相信还有第二个可选参数,它是一个替换一个或多个属性的序列化方式的函数。

但是,您不应该函数添加为对象的第二个属性!

在 Chrome 的控制台中尝试以下操作时:

JSON.stringify({a:1,b:'hello'})

这是结果:

"{"a":1,"b":"hello"}"
于 2014-05-27T18:55:13.723 回答