Как разобрать JSON, чтобы получить объект даты в JavaScript?
у меня есть следующий кусок JSON:
/Date(1293034567877)/
который является результатом этого кода .NET:
var obj = DateTime.Now;
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.Serialize(obj).Dump();
теперь проблема, с которой я сталкиваюсь, заключается в том, как создать объект Date из этого в JavaScript.
Все, что я мог найти, было невероятным решением регулярных выражений (многие из которых содержат ошибки).
трудно поверить, что нет элегантного решения, так как это все в JavaScrip, я имею в виду код JavaScript, пытающийся прочитать JSON (JavaScript Object Notation), который должен быть JavaScript код и на данный момент оказывается, что это не причина JavaScript не может сделать хорошую работу здесь.
Я также видел некоторые решения eval, которые я не мог заставить работать (помимо того, что они указывались как угроза безопасности).
неужели нет никакого способа сделать это элегантным способом?
аналогичный вопрос без ответа:
как разобрать ASP.NET формат даты JSON с GWT
16 ответов:
нет стандартного JSON-представления дат. Вы должны сделать то, что предложил @jAndy, а не сериализовать a
DateTimeвообще; просто отправьте строку даты RFC 1123ToString("r")или секунд-от-Unix-epoch номер, или что-то еще, что вы можете использовать в JavaScript, чтобы построитьDate.
JSON.функция parse принимает дополнительную функцию datetime reviver. Вы можете использовать такую функцию:
dateTimeReviver = function (key, value) { var a; if (typeof value === 'string') { a = /\/Date\((\d*)\)\//.exec(value); if (a) { return new Date(+a[1]); } } return value; }затем вызов
JSON.parse(somejsonstring,dateTimeReviver)и ваши даты выйдут правильно
ответ от Рой Тинкер здесь:
var date = new Date(parseInt(jsonDate.substr(6)));он говорит: функция substr извлекает часть" /Date ( ", а функция parseInt получает целое число и игнорирует") / " в конце. Полученное число передается в конструктор даты.
другой вариант - просто правильно отформатировать информацию на стороне ASP, чтобы JavaScript мог легко ее прочитать. Рекомендуется делать это за свой даты:
DateTime.Now()который должен возвращать такой формат:
7/22/2008 12:11:04 PMесли вы передадите это в JavaScript
Dateконструктор такой:var date = new Date('7/22/2008 12:11:04 PM');переменная
dateтеперь имеет это значение:Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time)естественно, вы можете отформатировать этот
DateTimeобъект в любой вид строки/int JSDateконструктор принимает.
Если вы используете дату Iso8601 стиля JavaScript в JSON, вы можете использовать это, начиная с MDN
var jsonDate = (new Date()).toJSON(); var backToDate = new Date(jsonDate); console.log(jsonDate); //2015-10-26T07:46:36.611Z
Что случилось с:
new Date(1293034567877);Это возвращает для меня " Ср 22 декабря 2010 16:16: 07 GMT+0000 (GMT стандартное время)".
или вам нужно получить номер из json?
вы можете конвертировать дату JSON в обычный формат даты в JavaScript.
var date = new Date(parseInt(jsonDate.substr(6)));
Я знаю, что это очень старая тема, но я хочу опубликовать это, чтобы помочь тем, кто сталкивается с этим, как я сделал.
Если вы не заботитесь об использовании стороннего скрипта, вы можете использовать момент, js Тогда вы можете использовать .формат() для все, что вы хотите.
AngularJS не смог разобрать .NET JSON date
/Date(xxxxxxxxxxxxx)/строка либо..Я стороной обошел этот вопрос путем форматирования даты его представления стандарту ISO 8601 строку вместо отсыпка
Dateобъект напрямую...вот пример ASP.NET код MVC..
return Json(new { date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format });пробовал
RFC 1123но это не работает.. Угловой рассматривает это как строку вместо даты.return Json(new { date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this });
Я не использовал .Net для таких вещей. Если вы смогли заставить его напечатать что-то вроде следующего, он должен работать.
обратите внимание, если вы не разбираете этот JSON строка каким-то другим способом или только ожидать, что пользователи будут иметь современные браузеры со встроенным парсером JSON вам нужно использовать JS framework или JSON2 для анализа строки JSON, выведенной сервером в реальный объект JSON.
// JSON received from server is in string format var jsonString = '{"date":1251877601000}'; //use JSON2 or some JS library to parse the string var jsonObject = JSON.parse( jsonString ); //now you have your date! alert( new Date(jsonObject.date) );
современные браузеры, такие как Firefox 3.5 и Internet Explorer 8, включают специальные функции для разбора JSON. Поскольку поддержка собственного браузера более эффективна и безопасна, чем eval (), ожидается, что поддержка собственного JSON будет включена в следующий стандарт ECMAScript.[6]
Видео
ответ на этот вопрос, используйте nuget для получения JSON.NET тогда используйте это внутри вашего
JsonResultспособ:JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */);в вашем представлении просто сделать это в
javascript:JSON.parse(/* Converted JSON object */)если это вызов ajax:
var request = $.ajax({ url: "@Url.Action("SomeAjaxAction", "SomeController")", dataType: "json"}); request.done(function (data, result) { var safe = JSON.parse(data); var date = new Date(safe.date); });один раз
JSON.parseбыл вызван, вы можете поместить дату JSON вnew Date, потому чтоJsonConvertсоздает правильный экземпляр времени ISO
Как упоминал Каллум, для меня лучший способ-изменить метод контроллера на string вместо JsonResult".
public string GetValues() { MyObject.DateFrom = DateTime.Now; return JsonConvert.SerializeObject(MyObject); }из метода ajax вы можете сделать что-то вроде этого
$.ajax({ url: "/MyController/GetValues", type: "post", success: function (data) { var validData = JSON.parse(data); //if you are using datepicker and you want set a format $("#DateFrom").val($.datepicker.formatDate("dd/mm/yy", new Date(validData.DateFrom))); // if you want the date as returned $("#DateFrom").val(new Date(validData.DateFrom)) } });
свидания - это всегда кошмар. Отвечая на ваш старый вопрос, пожалуй, это самый элегантный способ:
eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))с eval мы преобразуем нашу строку в код javascript. Затем мы удаляем"/", в функцию replace входит регулярное выражение. Поскольку мы начинаем с нового, то наши предложения будут исключать это:
new Date(1455418800000)теперь, одна вещь, которую я начал использовать давно, давно значениями, которые представлены в ТИКах... зачем? ну, локализация и перестать думать в том, как дата настроено на каждом сервере или на каждом клиенте. На самом деле, я использую его тоже в базах данных.
возможно, довольно поздно для этого ответа, но может помочь кому-нибудь здесь.
С помощью функции eval работает просто нужно удалить косую черту спереди и сзади.
var date1 = "/Date(25200000)/" eval("new " + date1.substring(1, date1.length - 1));урожайность Чт 01 января 1970 00:00: 00 GMT-0700 (Us Mountain Standard Time)
// // formats a .net date into a javascript compatible date // function FormatJsonDate(jsonDt) { var MIN_DATE = -62135578800000; // const var date = new Date(parseInt(jsonDt.substr(6, jsonDt.length-8))); return date.toString() == new Date(MIN_DATE).toString() ? "" : (date.getMonth() + 1) + "\" + date.getDate() + "\" + date.getFullYear(); }
function parseJsonDate(jsonDate) { var fullDate = new Date(parseInt(jsonDate.substr(6))); var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth; var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate; var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear(); return currentDate; };
function parseJsonDate(jsonDate) { var fullDate = new Date(parseInt(jsonDate.substr(6))); var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth; var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate; var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear(); return currentDate; };//используйте эту функцию
var objDate=parseJsonDate("\/Date(1443812400000)\/"); alert(objDate);
Comments