Как разобрать 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

1058   16  

16 ответов:

нет стандартного JSON-представления дат. Вы должны сделать то, что предложил @jAndy, а не сериализовать a DateTime вообще; просто отправьте строку даты RFC 1123 ToString("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 JS Date конструктор принимает.

Если вы используете дату 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) );

Wiki Ссылка

современные браузеры, такие как Firefox 3.5 и Internet Explorer 8, включают специальные функции для разбора JSON. Поскольку поддержка собственного браузера более эффективна и безопасна, чем eval (), ожидается, что поддержка собственного JSON будет включена в следующий стандарт ECMAScript.[6]


ссылка на файл JSON2

Видео

ответ на этот вопрос, используйте 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

    Ничего не найдено.