如http://www.json.org/js.html所述,JavaScript对象可以通过实现toJSON()方法来规定JSON.stringify()如何序列化它们。对于任意对象,此方法未定义,而数字和字符串似乎实现该方法。我很好奇 - 为什么对象没有实现?
编辑:我最初提到阵列有这种方法 - 他们没有。我为这种困惑道歉。答案 0 :(得分:5)
你提到的那些方法是由一些JavaScript引擎添加的(AFAIK最新版本的V8和Tracemonkey实现它们):
String.prototype.toJSON
Boolean.prototype.toJSON
Number.prototype.toJSON
Date.prototype.toJSON
虽然ECMAScript 5规范的唯一标准是Date.prototype.toJSON
。
我个人认为这些方法根本没用,String
,Boolean
和Number
的结果完全等同于调用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);
}