考虑一下:
var object = {date: new Date()};
JSON.stringify(object, function(key, value) {
console.log('---');
console.log('key:', key);
console.log('value:', value);
console.log('value instanceof Date:', value instanceof Date);
return value;
});
正如documentation所说:
replacer参数可以是函数,也可以是数组。作为一个函数,它需要两个参数,键和值被字符串化。找到密钥的对象作为replacer的this参数提供。最初使用表示要进行字符串化的对象的空键调用它,然后为要进行字符串化的对象或数组上的每个属性调用它。
...
如果返回任何其他对象,则会以递归方式将对象字符串化为JSON字符串,并在每个属性上调用replacer函数,除非该对象是函数,在这种情况下,不会向JSON字符串添加任何内容。
但是如果你运行代码,你会得到这个:
---
key:
value: { date: Fri Jan 10 2014 02:25:00 GMT+0100 (CET) }
value instanceof Date: false
---
key: date
value: 2014-01-10T01:25:00.262Z
value instanceof Date: false
这意味着,在调用replacer函数之前,date属性已被字符串化。这是正常的行为还是我错过了什么?如何在不覆盖默认Date
方法的情况下影响toJSON
字符串格式?
谢谢!
根据回复和下一次研究,文档似乎目前尚不清楚,并且toJSON
在更换器功能之前被调用。根据Pills的回应,这个片段应该可以完成这项工作:
var object = {date: new Date };
JSON.stringify(object, function(key, value) {
if (typeof(value) === 'object') {
for (var k in value) {
if (value[k] instanceof Date) {
value[k] = value[k].getTime();
}
}
}
return value;
});
Xotic750的解决方案比以前的解决方案要好得多。
答案 0 :(得分:2)
也许你可以在将对象传递给JSON
之前进行格式化,但是否则有可能:
JSON
在调用替换程序之前使用对象toJSON
方法。
因此,在调用stringify
之前,先存储toJSON
方法,然后再将其恢复。
var object = {
date: new Date()
},
storeToJSON = Date.prototype.toJSON;
delete Date.prototype.toJSON;
JSON.stringify(object, function (key, value) {
console.log('---');
console.log('key:', key);
console.log('value:', value);
console.log('value instanceof Date:', value instanceof Date);
return value;
});
Date.prototype.toJSON = storeToJSON;
上
答案 1 :(得分:2)
它很安静,只是为了完成它。
根据this Q/A和MDN JSON.stringify article,使用找到密钥的对象的实例调用替换器,因此无需更改原型或执行其他操作:
function log(what) {
what = what || "";
document.getElementById("out").innerText += what + "\n";
}
function replacer(key, value) {
console.log(this);
log("Key: '" + key + "' = '" + value + "'");
log("this = " + this);
log("this[key] = " + this[key]);
log("this[key] instanceof Date = " + (this[key] instanceof Date));
log("this instanceof Date = " + (this[key] instanceof Date));
if (this[key] instanceof Date) {
return "This was a date: " + this[key].getTime();
}
return value;
}
var obj = {
d: new Date()
};
var result;
result = JSON.stringify(new Date(), replacer);
log();
log(result);
log();
result = JSON.stringify(obj, replacer);
log();
log(result);
<pre id="out"></pre>