Десериализация клиентских дат AJAX JSON - PullRequest
36 голосов
/ 17 сентября 2008

Учитывая следующее представление даты JSON:

"\/Date(1221644506800-0700)\/"

Как вы десериализуете это в форме типа даты JavaScript?

Я пытался использовать MS AJAX JavaScrioptSerializer, как показано ниже:

Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")

Однако все, что я получаю, это буквальная строковая дата.

Ответы [ 7 ]

28 голосов
/ 06 июня 2009

Если вы знаете, что строка определенно является датой, я предпочитаю делать это:

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
16 голосов
/ 16 апреля 2010

Бертран Лерой, который работал над ASP.NET Atlas / AJAX, описал дизайн вывода JavaScriptSerializer DateTime и раскрыл происхождение таинственных начальных и конечных слешей. Он сделал эту рекомендацию:

запустите простой поиск «\ / Date ((\ d +)) \ /» и замените его на «new Date ($ 1)» перед вычислением (но после проверки)

Я реализовал это как:

var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "<br />");

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$");
function toDate(s) {
    if (!s) {
        return null;
    }
    var constructor = s.replace(toDateRe, "new Date($1)");
    if (constructor == s) {
        throw 'Invalid serialized DateTime value: "' + s + '"';
    }
    return eval(constructor);
}

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");

Это очень близко ко многим другим ответам:

  • Используйте привязанный RegEx, как это делал Sjoerd Visscher - не забывайте ^ и $.
  • Избегайте string.replace и опций 'g' или 'i' на вашем RegEx. "/ Date (1271389496563) // Date (1271389496563) /" вообще не должно работать.
10 голосов
/ 17 сентября 2008

Значение JSON - это строка, число, объект, массив, истина, ложь или ноль. Так что это просто строка. Официального способа представления дат в формате JSON не существует. Этот синтаксис взят из реализации asp.net asp.net. Другие используют формат ISO 8601.

Вы можете разобрать это так:

var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);
5 голосов
/ 09 января 2009

Регулярное выражение, используемое в методе десериализации ASPJ AJAX, ищет строку, которая выглядит как «/ Date (1234) /» (сама строка должна содержать кавычки и косые черты). Чтобы получить такую ​​строку, вам понадобится экранировать кавычки и символы обратной косой черты, поэтому код JavaScript для создания строки выглядит как "\" \ / Date (1234) \ / \ "".

Это будет работать.

Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")

Это немного странно, но я обнаружил, что мне нужно сериализовать дату, затем сериализовать возвращаемую строку, а затем десериализовать на стороне клиента один раз.

Примерно так.

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);
3 голосов
/ 30 октября 2009

Для тех, кто не хочет использовать Microsoft Ajax, просто добавьте функцию-прототип в класс строки.

* 1003 Е.Г. *

    String.prototype.dateFromJSON = function () {
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};

Не хотите использовать eval? Попробуйте что-нибудь простое, например

var date = new Date(parseInt(jsonDate.substr(6)));

Как примечание, я привык думать, что Microsoft вводит в заблуждение, используя этот формат. Однако спецификация JSON не очень понятна, когда речь идет об определении способа описания дат в JSON.

2 голосов
/ 28 декабря 2016

На самом деле, momentjs поддерживает этот формат, вы можете сделать что-то вроде:

    var momentValue = moment(value);

    momentValue.toDate();

Возвращает значение в формате даты javascript.

1 голос
/ 17 сентября 2008

Большое число - стандартное время JS

new Date(1221644506800)

Ср 17 сентября 2008 19:41:46 GMT + 1000 (EST)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...