我正在使用Json.NET序列化一些数据。日期的序列化方式非常灵活,因此我可以将其输出为任何必要的格式。
浏览器提供的JSON.parse
函数是否会反序列化为Date
对象的日期格式?如果没有,是否有人知道将 JSON 反序列化为 JavaScript 对象(包括日期)的好库?
在反序列化 JSON 的其余部分后,我真的不想使用RegExp
一大堆丑陋的代码来解析日期;我只想要一个完成整个事情的函数调用。
我正在使用Json.NET序列化一些数据。日期的序列化方式非常灵活,因此我可以将其输出为任何必要的格式。
浏览器提供的JSON.parse
函数是否会反序列化为Date
对象的日期格式?如果没有,是否有人知道将 JSON 反序列化为 JavaScript 对象(包括日期)的好库?
在反序列化 JSON 的其余部分后,我真的不想使用RegExp
一大堆丑陋的代码来解析日期;我只想要一个完成整个事情的函数调用。
浏览器提供的 JSON.parse 函数是否会反序列化为 Date 对象的日期格式?
不,该标准没有关于日期的任何内容。
但是该Date
对象现在有一个特定的toJSON
函数,它实际上定义了 JSON 日期序列化的标准。它基于toISOString
. 请参阅EcmaScript。
并且MSDN 有一个关于如何为标准JSON.parse函数构建一个 reviver 以获取 Dates 的文档。
提炼 :
var jsontext = '{ "hiredate": "2008-01-01T12:00:00Z", "birthdate": "2008-12-25T12:00:00Z" }';
var dates = JSON.parse(jsontext, dateReviver);
document.write(dates.birthdate.toUTCString());
function dateReviver(key, value) {
var a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
};
// Output:
// Thu, 25 Dec 2008 12:00:00 UTC
这不完全是“一个正则表达式和一大堆丑陋的代码,用于在反序列化 JSON 的其余部分后解析日期;” ,而是一个正则表达式和一堆合理的丑陋但可重用的代码来解析反序列化期间的日期......
缺点是您无法区分与序列化日期相同的日期和字符串。这使得 JSON 格式模棱两可,这可能就是为什么JSON.parse
不冒险正常反序列化这些日期的原因。
为什么不
var d = new Date(Date.parse(utcDateString));
呢?