Подтвердить что ты не робот

Дезертировка клиентских сторон AJAX JSON

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

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

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

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

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

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

4b9b3361

Ответ 1

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

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))

Ответ 2

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

запустите простой поиск для "\/Date ((\ d +)) \/" и замените "новой датой ($ 1)" перед eval (но после проверки)

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

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. "/Дата (1271389496563)//Дата (1271389496563)/" не должна работать вообще.

Ответ 3

Значение JSON - это строка, число, объект, массив, истина, ложь или нуль. Так что это всего лишь строка. Официального способа представления дат в JSON нет. Этот синтаксис является результатом реализации asp.net ajax. Другие используют формат 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]);

Ответ 4

Регулярное выражение, используемое в методе дескрипции ASP.NET 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);

Ответ 5

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

например.

    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.

Ответ 6

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

new Date(1221644506800)

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

Ответ 7

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

    var momentValue = moment(value);

    momentValue.toDate();

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