【问题标题】:Javascript JSON.stringify function is not workingJavascript JSON.stringify 函数不起作用
【发布时间】:2014-05-27 18:35:33
【问题描述】:

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

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

本机 JSON 字符串化未按预期工作。 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 函数?

【问题讨论】:

  • 对于不支持JSON.stringify的浏览器,您应该使用json2.js
  • 我的问题仍然悬而未决('在本机代码中执行输入对象中的 toJSON 函数是否有任何特定原因?`)。如果有人知道原因,请更新此线程。
  • 这样你就可以自定义序列化了。我已经用一个例子为你更新了我的答案。

标签: javascript json browser javascript-engine


【解决方案1】:

这是因为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 函数,这可能会导致意外结果。

【讨论】:

  • 谢谢@dhsto,我想我必须通过github.com/douglascrockford/JSON-js/blob/master/json2.js 中的代码(您的答案中的链接)。
  • @hilarudeens 如果我是你,我不会打扰。我只会使用您在问题中使用的方法,但将您的新函数命名为 JSON.stringify 以外的其他名称。
  • 我同意。覆盖本机不是一个好习惯。希望这对于想要进一步深入研究的其他开发人员来说是一个很好的起点。
  • 不错的答案。我同意。
【解决方案2】:

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

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

JSON.stringify(object, function(key, value) {
  if (typeof value === "function") {
    return undefined;
  }
  return value;
});

【讨论】:

  • 谢谢老兄,但是我的问题不同。在执行JSON.stringify({a:1, toJSON: function(){}}) 时,我期待{"a":1}
  • 它不工作。我在 chrome 中尝试过JSON.stringify({a:1, toJSON: function(){ return "Hello"; }}, function(key, value) { debugger; if (typeof value === "function") { return undefined; } return value; });。你运行过这段代码吗?
【解决方案3】:

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

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

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

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

这是结果:

"{"a":1,"b":"hello"}"

【讨论】:

  • 对不起,我的问题不同。在执行JSON.stringify({a:1, toJSON: function(){}}) 时,我期待{"a":1} 不起作用。
猜你喜欢
  • 2011-12-01
  • 2013-12-02
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多