Десериализация Client-Side AJAX JSON Даты

голоса
35

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

\/Date(1221644506800-0700)\/

Как десериализации это в это JavaScript форма Дата-тип?

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

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

Тем не менее, все, что я вернусь буквальная строка дата.

Задан 17/09/2008 в 12:09
источник пользователем
На других языках...                            


7 ответов

голоса
28

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

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
Ответил 06/06/2009 в 06:51
источник пользователем

голоса
16

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

запустить простой поиск "\ / Дата ((\ 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 как и Сьерд Висшер - не забудьте ^ и $.
  • Избегайте string.replace, и «г» или «Я» параметры на вашем RegEx. "/ Дата (1271389496563) // Дата (1271389496563) /" не должны работать.
Ответил 16/04/2010 в 17:25
источник пользователем

голоса
10

Значение 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]);
Ответил 17/09/2008 в 13:07
источник пользователем

голоса
5

Регулярное выражение, используемое в методе десериализации 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);
Ответил 09/01/2009 в 17:59
источник пользователем

голоса
3

Для тех, кто не хочет использовать 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.

Ответил 29/10/2009 в 23:32
источник пользователем

голоса
1

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

    var momentValue = moment(value);

    momentValue.toDate();

Это возвращает значение в яваскрипта формате даты

Ответил 28/12/2016 в 18:26
источник пользователем

голоса
1

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

new Date(1221644506800)

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

Ответил 17/09/2008 в 12:41
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more