JSON.parse
には、ほとんど知られていない第2パラメータ「reviver」機能があります。これは正確にこの目的のために使用されます:最初の解析中に日付文字列をDate
オブジェクト(または、仮に、文字列から変換したい他の種類のオブジェクト)に復活させる。
があり、この程度SO postをだし、ここでの実装例とプロパティは夫婦共通の日付のエンコーディングのチェックを行います機能が含まblog postです(ISO &をその奇妙な.NETのAJAX形式)、Date
に解析する前に。ここで
はそのブログ記事からの重要な機能は、FWIWです:
// JSON date deserializer
// use as the second, 'reviver' argument to JSON.parse();
if (window.JSON && !window.JSON.dateParser) {
var reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
var reMsAjax = /^\/Date\((d|-|.*)\)[\/|\\]$/;
JSON.dateParser = function (key, value) {
// first, just make sure the property is a string:
if (typeof value === 'string') {
// then, use regex to see if it's an ISO-formatted string
var a = reISO.exec(value);
if (a) {
// if so, Date() can parse it:
return new Date(value);
}
// otherwise, see if it's a wacky Microsoft-format string:
a = reMsAjax.exec(value);
if (a) {
// and perform some jujitsu to make use of it:
var b = a[1].split(/[-+,.]/);
return new Date(b[0] ? +b[0] : 0 - +b[1]);
}
// here, you could insert any additional tests and parse instructions you like, for other date syntaxes...
}
// important: you need to return any values you're not parsing, or they die...
return value;
};
}
// use: JSON.parse(json,JSON.dateParser);
(ISO 8601の日付のための適切な正規表現についてlots of opinionsがありますYMMVは。また、関数をグローバルJSONオブジェクトにパンチする特別な理由はありません。どこにでも好きな場所に保管/参照することができます。 )
出典
2014-05-16 01:30:03
XML
ありがとうございました。これらのライブラリは日付に機能を追加するようですが、jsonパーサーを拡張/実装するようには見えません。 – mdeangelo272