На самом деле можно изменить способ сериализации объекта Date в JSON.В сочетании с функцией восстановления можно создать двунаправленное решение, которое будет автоматически работать при сериализации и легко использоваться при десериализации.
Сначала измените сериализацию следующим образом:
Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() }
Это изменит представление объекта Date в метку времени UNIX с префиксом в качестве маркера:
> json = JSON.stringify({test:new Date()});
"{"test":"{timestamp}1380164268633"}"
Затем вы можете создать функцию восстановления, которая автоматически отфильтрует следующие значения:
function json_deserialize_helper(key,value) {
if ( typeof value === 'string' ) {
var regexp;
regexp = /^{timestamp}(\d*)$/.exec(value);
if ( regexp ) {
return new Date(+regexp[1]);
}
}
return value;
}
(Предоставлено: этот код был в основном скопирован из этого ответа в связанном вопросе: https://stackoverflow.com/a/14509447/2572897)
Теперь с этой настройкой десериализация нашего результата из ранее приведет к объекту Date снова:
> JSON.parse(json, json_deserialize_helper);
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)}
Или вы можете не изменять сериализацию, а использовать регулярное выражение для перехвата стандартного формата сериализации:
function json_deserialize_helper(key,value) {
if ( typeof value === 'string' ) {
var regexp;
regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value);
if ( regexp ) {
return new Date(value);
}
}
return value;
}
Пример:
> json = JSON.stringify({test:new Date()})
"{"test":"2013-09-26T03:05:26.563Z"}"
> JSON.parse(json, json_deserialize_helper)
Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)}