【发布时间】:2014-01-28 20:41:24
【问题描述】:
考虑一下:
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 参数可以是函数或数组。作为一个函数,它有两个参数,键和值被字符串化。找到密钥的对象作为替换器的 this 参数提供。最初,它使用一个表示正在字符串化的对象的空键调用,然后为正在字符串化的对象或数组上的每个属性调用它。
...
如果您返回任何其他对象,则该对象会递归地字符串化为 JSON 字符串,并在每个属性上调用替换函数,除非该对象是一个函数,在这种情况下不会向 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
这意味着,在调用替换函数之前,日期属性已被字符串化。这是正常行为还是我错过了什么?如何在不覆盖默认toJSON 方法的情况下影响Date 字符串化的格式?
谢谢!
编辑
根据回复和下一次研究,此时文档似乎还不清楚,toJSON 在替换函数之前被调用。根据 Pills 的回复,这个 sn-p 应该可以完成这项工作:
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;
});
编辑#2
Xotic750 的解决方案比之前的好很多。
【问题讨论】:
-
文档似乎有点不清楚,但似乎在为单个属性进行回调之前完成了字符串化。你可以试试这样的:jsfiddle.net/95eeS
-
查看JSON2 的来源,任何
toJSON方法都会在替换器之前被调用。
标签: javascript json