为什么JavaScript对象没有toJSON()方法?

时间:2010-01-03 23:10:41

标签: javascript json

http://www.json.org/js.html所述,JavaScript对象可以通过实现toJSON()方法来规定JSON.stringify()如何序列化它们。对于任意对象,此方法未定义,而数字和字符串似乎实现该方法。我很好奇 - 为什么对象没有实现?

编辑:我最初提到阵列有这种方法 - 他们没有。我为这种困惑道歉。

6 个答案:

答案 0 :(得分:5)

你提到的那些方法是由一些JavaScript引擎添加的(AFAIK最新版本的V8和Tracemonkey实现它们):

String.prototype.toJSON
Boolean.prototype.toJSON
Number.prototype.toJSON
Date.prototype.toJSON

虽然ECMAScript 5规范的唯一标准是Date.prototype.toJSON

我个人认为这些方法根本没用,StringBooleanNumber的结果完全等同于调用valueOf方法,而Date的结果相当于调用toISOString

所以问题是:为什么本机对象没有toJSON()方法?

好吧,在JSON对象可用(第15.12节)的情况下,向Object.prototype添加另一种方法是不值得的,而且我认为添加它是个坏主意...

答案 1 :(得分:5)

真实原因

虽然@CMS是正确的,但浏览器会让 添加这些,这一点完全被遗漏了。原因是 JSON规范为任何对象调用可选的toJSON方法,而该方法又被调用序列化非规范结构到规范的。

var O = function O() {
    this.val = 'value';
    this.toJSON = function () { return ['VALUE!']; };
};

var o = new O();
var s = JSON.stringify(o);

console.log(s);  // >> ["VALUE!"]

一个例子是 Set Data-Structure ,其结构实际上是一个具有values方法的对象。这样就可以编写this.toJSON = values;来为JSON.stringify方法提供正确的序列化策略。

因此,简而言之,它为JSON.stringify提供了输出替代结构的正确策略。

希望这有帮助。

答案 2 :(得分:3)

我不认为Numbers等具有默认的JSON实现。也许你正在使用Prototype或其他一些框架?

http://www.w3schools.com/jsref/jsref_obj_number.asp

http://www.w3schools.com/jsref/jsref_obj_array.asp

来自http://www.prototypejs.org/learn/json

  

编码

     

原型的JSON编码略有不同   与克罗克福德不同   实施,因为它没有扩展   Object.prototype中。下列   方法可用:Number#toJSON,   String#toJSON,Array#toJSON,   哈希#toJSON,Date#toJSON和   Object.toJSON。

答案 3 :(得分:0)

这是不在任意对象上实现函数的标准。

尝试console.log({}),你什么也看不到。

答案 4 :(得分:0)

它会保存哪些属性?一个普通的旧对象没有任何。

答案 5 :(得分:-3)

我怀疑这是一个原因 - 数组似乎也没有它们。以下是我实现它的方法:

Array.prototype.toJSON = Object.prototype.toJSON = function() {
  return JSON.stringify(this);
}