Десериализация клиентского Ajax даты JSON

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

36
задан Muntasir 6 December 2017 в 06:44
поделиться

6 ответов

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

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
29
ответ дан 27 November 2019 в 05:48
поделиться

Значение 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]);
11
ответ дан Sjoerd Visscher 27 November 2019 в 05:48
поделиться

Регулярное выражение, используемое в Ajax ASP.net, десериализовывает метод, ищет строку, которая похожа "/на Дату (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);
6
ответ дан Kyle Jones 27 November 2019 в 05:48
поделиться

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

new Date(1221644506800)

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

1
ответ дан Daniel 27 November 2019 в 05:48
поделиться

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

3
ответ дан 27 November 2019 в 05:48
поделиться

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

выполните простой поиск «\ / Date ((\ d +)) \ /» и замените его на «new Date ($ 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 />");

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

  • Используйте заякоренное регулярное выражение, как это сделал Сьорд Висшер - не забывайте ^ и $.
  • Избегайте string.replace и параметров 'g' или 'i' в вашем RegEx. "/ Date (1271389496563) // Date (1271389496563) /" вообще не должно работать.
17
ответ дан 27 November 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: