Javascript JSON.stringify函数不起作用

时间:2014-05-27 18:35:34

标签: javascript json browser javascript-engine

我试图将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 函数?

3 个答案:

答案 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"}"