JSONの仕様では、Date型は定義されていません。しかし、今回どうしてもsocial-cms-backendでJSONにDate型を埋め込みたくなりました。
stackoverflowで面白い投稿を見つけました。
http://stackoverflow.com/questions/4511705/how-to-parse-json-to-receive-a-date-object-in-javascript
どうやらMicrosoftが.NET Frameworkで独自に拡張しているようです。
http://msdn.microsoft.com/en-us/library/bb412170.aspx
これは、"\/Date(1234567)\/
という文字列をDate型とみなすというものです。正確にはタイムゾーンも指定できるようですが、使わないので省略します。
さて、JSON.parseには第二引数にreceiverを指定して独自のdeserializeができるようです。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
stackoverflowの投稿はこれを使ったサンプルです。ただし、receiverに届くときにはバックスラッシュのエスケープは消えているので、"/Date(1234567)/"
もDate型に変換されます。分かって使っている分にはよいですが、JSONの仕様からは外れ(いや、Microsoftのやり方もハックですが)、独自のコンベンションという感じですね。
参考までに、コードを載せておきます。
function parseJSON(str) {
function receiver(key, value) {
if (typeof value === 'string') {
var match = /\/Date\((\d+)\)\//.exec(value);
if (match) {
return new Date(parseInt(match[1], 10));
}
}
return value;
}
return JSON.parse(str, receiver);
}
そうそう、例で示した1234567の数値のところは、Date.now()と同じようにミリ秒です。
コメント