Comment analyser JSON pour recevoir un objet Date en JavaScript?
j'ai un morceau de JSON suivant:
/Date(1293034567877)/
qui est le résultat de ce code. net:
var obj = DateTime.Now;
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.Serialize(obj).Dump();
maintenant, le problème auquel je suis confronté est de savoir comment créer un objet Date à partir de cela en JavaScript. Tout ce que j'ai pu trouver était la solution incroyable regex (beaucoup contenant des bogues).
il est difficile de croire qu'il n'y a pas de solution élégante car tout cela est dans JavaScrip, je veux dire le code JavaScript essayant de lire JSON (JavaScript Object Notation) qui est supposé être un code JavaScript et à ce moment il s'avère que ce N'est pas parce que JavaScript ne peut pas faire un bon travail ici.
j'ai également vu quelques solutions d'évaluation que je ne pouvais pas faire fonctionner (en plus d'être pointé comme une menace de sécurité).
est-il vraiment impossible de le faire de manière élégante?
question similaire sans réponse réelle:
comment analyser ASP.NET JSON Date format avec GWT
16 réponses
il n'y a pas de représentation JSON standard des dates. Vous devez faire ce que @jAndy a suggéré et ne pas sérialiser un DateTime
du tout; il suffit d'envoyer une chaîne de date RFC 1123 ToString("r")
ou un nombre de secondes-De-Unix-epoch, ou quelque chose d'autre que vous pouvez utiliser dans le JavaScript pour construire un Date
.
The JSON.la fonction parse accepte une fonction de réveil DateTime optionnelle. Vous pouvez utiliser une fonction comme ceci:
dateTimeReviver = function (key, value) {
var a;
if (typeof value === 'string') {
a = /\/Date\((\d*)\)\//.exec(value);
if (a) {
return new Date(+a[1]);
}
}
return value;
}
puis appeler
JSON.parse(somejsonstring,dateTimeReviver)
Et de vos dates sortira droit
Cette réponse de Roy Bricoler ici :
var date = new Date(parseInt(jsonDate.substr(6)));
, Comme il dit: La fonction substr, prend le "/Date(" partie, et la fonction parseInt obtient le nombre entier et l'ignore ")/" à la fin. Le nombre résultant est passé dans le constructeur de Date.
une autre option est de simplement formater vos informations correctement du côté ASP de sorte que JavaScript puisse facilement les lire. Considérer faire ceci pour vos dates:
DateTime.Now()
qui devrait retourner un format comme celui-ci:
7/22/2008 12:11:04 PM
si vous passez cela dans un JavaScript Date
constructeur comme ceci:
var date = new Date('7/22/2008 12:11:04 PM');
la variable date
contient maintenant cette valeur:
Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time)
naturellement, vous pouvez formater cet objet DateTime
en n'importe quelle sorte de chaîne/int que le constructeur js Date
accepte.
Quel est le problème avec:
new Date(1293034567877);
Cela renvoie pour moi "Mer 22 Déc 2010 16:16:07 GMT+0000 (GMT)".
ou avez-vous besoin d'obtenir le numéro du json?
vous pouvez convertir la Date JSON en format de date normal en JavaScript.
var date = new Date(parseInt(jsonDate.substr(6)));
je sais que c'est un fil très ancien, mais je souhaite poster ceci pour aider ceux qui se cognent dans ce comme je l'ai fait.
si vous ne vous souciez pas d'utiliser un script tiers, vous pouvez utiliser moment, js Ensuite, vous pouvez utiliser .format() pour formater ce que vous voulez.
AngularJS ne pouvait pas non plus Parser .NET JSON date /Date(xxxxxxxxxxxxx)/
string..
j'ai mis de côté cette question en formatant la date à sa représentation de chaîne ISO 8601 au lieu de décharger l'objet Date
directement...
voici un échantillon de ASP.NET code MVC..
return Json(new {
date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format
});
j'ai essayé RFC 1123
mais ça ne marche pas.. Angular le traite comme une chaîne de caractères au lieu d'une Date.
return Json(new {
date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this
});
Je n'ai pas utilisé .Net pour ce genre de choses. Si vous avez pu le faire imprimer quelque chose comme ce qui suit, ça devrait marcher.
Note, sauf si vous analysez que JSON string par d'autres moyens ou seulement s'attendre à ce que les utilisateurs aient des browers modernes avec un analyseur JSON intégré, vous devez utiliser un framework JS ou JSON2 pour analyser la chaîne JSON émise par le serveur dans un objet JSON réel.
// 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) );
navigateurs modernes, tels que Firefox 3.5 et Internet Explorer 8, comprennent des fonctionnalités spéciales pour l'analyse JSON. Comme le support natif du navigateur est plus efficace et sûr que eval(), il est prévu que le support natif JSON sera inclus dans le prochain standard ECMAScript.[6]
la réponse à cette question Est, utilisez nuget pour obtenir JSON.NET puis utilisez ceci dans votre JsonResult
méthode:
JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */);
à l'intérieur de votre point de vue simple de faire cela en javascript
:
JSON.parse(/* Converted JSON object */)
S'il s'agit d'un appel 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); });
une fois que JSON.parse
a été appelé, vous pouvez mettre la date JSON dans une instance new Date
parce que JsonConvert
crée une instance de temps ISO appropriée
comme Callum l'a mentionné, pour moi, le meilleur moyen est de changer la méthode du Controller en string au lieu de JsonResult".
public string GetValues()
{
MyObject.DateFrom = DateTime.Now;
return JsonConvert.SerializeObject(MyObject);
}
de la méthode ajax vous pouvez faire quelque chose comme ça
$.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))
}
});
les Dates sont toujours un cauchemar. Répondant à votre vieille question, c'est peut-être la façon la plus élégante:
eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))
avec eval nous convertissons notre chaîne de caractères en code javascript. Puis on enlève le " / " dans la fonction remplacer est une expression régulière. Comme nous commençons par nouveau, alors nos phrases excécuteront ceci:
new Date(1455418800000)
maintenant, une chose que j'ai commencé à utiliser il y a longtemps, ce sont les valeurs longues qui sont représentées dans les tiques... pourquoi? bien, localisation et arrêter de penser à quelle date est configuré sur chaque serveur ou chaque client. En fait, je l'utilise aussi dans les bases de données.
est peut-être en retard pour cette réponse, mais peut aider n'importe qui ici.
en utilisant la fonction eval fonctionne juste doivent enlever la barre oblique avant à l'avant et à l'arrière.
var date1 = "/Date(25200000)/"
eval("new " + date1.substring(1, date1.length - 1));
les rendements Jeu 01 Jan 1970 00:00:00 GMT-0700 (états-unis Heure normale des rocheuses)
//
// 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;
};
/ / utiliser cette fonction
var objDate=parseJsonDate("\/Date(1443812400000)\/");
alert(objDate);