web-dev-qa-db-fra.com

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, c'est une solution de regex incroyable (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 en ce moment, il s'avère que ce n'est pas parce que JavaScript ne peut pas fais du bon travail ici.

J'ai également vu des solutions d'évaluation que je ne pouvais pas mettre au travail (en plus d'être désignées comme une menace à la sécurité).

N'y a-t-il vraiment aucun moyen de le faire d'une manière élégante?

Question similaire sans vraie réponse:
Comment analyser le format de date ASP.NET JSON avec GWT

97
Piotr Owsiak

Il n’existe pas de représentation JSON standard des dates. Vous devriez faire ce que @jAndy a suggéré et ne pas sérialiser une DateTime du tout; envoyez simplement une chaîne de date RFC 1123 ToString("r") ou un nombre de secondes d'Unix-Epoch, ou autre chose que vous pouvez utiliser dans JavaScript pour construire une Date.

43
Jacob

La fonction JSON.parse accepte une fonction facultative Reviver DateTime. Vous pouvez utiliser une fonction comme celle-ci:

dateTimeReviver = function (key, value) {
    var a;
    if (typeof value === 'string') {
        a = /\/Date\((\d*)\)\//.exec(value);
        if (a) {
            return new Date(+a[1]);
        }
    }
    return value;
}

Alors appelez 

JSON.parse(somejsonstring,dateTimeReviver)

Et vos dates vont bien

110
Tim

Cette réponse de Roy Tinker ici :

var date = new Date(parseInt(jsonDate.substr(6)));

Comme il le dit: La fonction substr extrait la partie "/ Date (") et la fonction parseInt obtient le nombre entier et ignore le ") /" à la fin. Le nombre résultant est transmis au constructeur Date.

Une autre option consiste simplement à formater correctement vos informations sur le côté ASP de sorte que JavaScript puisse facilement les lire. Pensez à le faire pour vos dates:

DateTime.Now()

Ce qui devrait retourner un format comme celui-ci:

7/22/2008 12:11:04 PM

Si vous passez ceci dans un constructeur JavaScript Date 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 quel type de chaîne/int accepté par le constructeur JS Date.

43
treeface

si vous utilisez la date de style JavaScript ISO8601 en JSON, vous pouvez l'utiliser de MDN

var jsonDate = (new Date()).toJSON();
var backToDate = new Date(jsonDate);
console.log(jsonDate); //2015-10-26T07:46:36.611Z
15
LeeGee

Quel est le problème avec:

new Date(1293034567877);

Cela revient pour moi "Mer 22 décembre 2010 16:16:07 GMT + 0000 (heure normale de GMT)".

Ou avez-vous besoin d'obtenir le numéro sur le JSON?

6
Psytronic

Vous pouvez convertir la date JSON au format de date normal en JavaScript.

var date = new Date(parseInt(jsonDate.substr(6)));
5
ViPuL5

Je sais que c'est un très vieux sujet, mais je souhaite le poster pour aider ceux qui se heurtent comme moi.

si vous ne vous souciez pas d'utiliser un script tiers, vous pouvez utiliser moment, js Vous pouvez ensuite utiliser .format () pour le formater à votre guise.

2
Eman

AngularJS n’a pas pu analyser la chaîne /Date(xxxxxxxxxxxxx)/ chaîne JSON .NET soit ..

J'ai résolu ce problème en formatant la date selon sa représentation sous forme de chaîne ISO 8601 au lieu de vider directement l'objet Date ... 

Voici un exemple de code ASP.NET MVC.

return Json(new { 
  date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format
});

J'ai essayé RFC 1123 mais cela ne fonctionne pas .. Angular traite cela comme une chaîne au lieu de Date.

return Json(new { 
  date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this
});
1
Rosdi Kasim

Les dates sont toujours un cauchemar. Répondant à votre ancienne question, c'est peut-être la manière la plus élégante:

eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))

Avec eval, nous convertissons notre chaîne en code javascript. Ensuite, nous supprimons le "/", dans la fonction de remplacement est une expression régulière. Comme nous commençons avec nouveau, nos phrases vont exécuter ceci:

new Date(1455418800000)

Maintenant, une chose que j'ai commencé à utiliser il y a longtemps est que les valeurs longues représentées par des ticks sont Eh bien, la localisation et l’arrêt de penser à la façon dont la date est configurée sur chaque serveur ou chaque client. En fait, je l'utilise aussi dans les bases de données.

Peut-être est-il assez tard pour cette réponse, mais peut aider n'importe qui ici.

J'ai rencontré un problème avec une API externe fournissant des dates dans ce format, parfois même avec des informations de différence UTC telles que /Date(123232313131+1000)/. J'ai pu le transformer en objet js Date avec le code suivant

var val = '/Date(123232311-1000)/';
var pattern = /^\/Date\([0-9]+((\+|\-)[0-9]+)?\)\/$/;
var date = null;

// Check that the value matches /Date(123232311-1000)/ format
if (pattern.test(val)) {
  var number = val.replace('/Date(', '',).replace(')/', '');
  if (number.indexOf('+') >= 0) {
    var split = number.split('+');
    number = parseInt(split[0]) + parseInt(split[1]);
  } else if (number.indexOf('-') >= 0) {
    var split = number.split('-');
    number = parseInt(split[0]) - parseInt(split[1]);
  } else {
    number = parseInt(number);
    date = new Date(number);
  }
}
0
Martin Vich

en utilisant la fonction eval, il suffit de supprimer la barre oblique à l’avant et à l’arrière. 

var date1 = "/Date(25200000)/"
eval("new " + date1.substring(1, date1.length - 1));

rendements jeu. janv. 01 1970 00:00:00 GMT-0700 (heure normale des Rocheuses)

0
vernmic

La réponse à cette question est, utilisez nuget pour obtenir JSON.NET, puis utilisez ceci dans votre méthode JsonResult:

JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */);

dans votre vue, faites simplement ceci dans javascript:

JSON.parse(/* Converted JSON object */)

Si c'est 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 car JsonConvert crée une instance de temps ISO appropriée

0
Callum Linington

Je n'ai pas utilisé .Net pour des choses comme ça. Si vous pouviez le faire imprimer quelque chose comme ce qui suit, cela devrait fonctionner.

Remarque: sauf si vous analysez ce JSON string par un autre moyen ou si vous vous attendez à ce que les utilisateurs disposent de sources modernes avec un analyseur JSON intégré, vous devez utiliser un framework JS ou JSON2 pour analyser la chaîne JSON générée par le serveur. dans un véritable objet 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) );

Lien Wiki

Les navigateurs modernes, tels que Firefox 3.5 et Internet Explorer 8, incluent des fonctionnalités spéciales pour l'analyse JSON. La prise en charge du navigateur natif étant plus efficace et sécurisée que eval (), il est prévu que la prise en charge de JSON natif sera incluse dans le prochain standard ECMAScript. [6]


Lien vers un fichier JSON2

Exemple en direct

0
subhaze
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;
};
0
Muzafar

Comme Callum l’a mentionné, le meilleur moyen pour moi est de changer la méthode du contrôleur en chaîne plutôt que 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))
}
});
0
onixpam