My JSON String contient un champ de date qui renvoie une telle valeur:
var Site = { ..... dateReviver: function(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; }, loadArticle: function(id) { .... proxy.getArticle(id, function(response) { var data = JSON.parse(response.result, Site.dateReviver); .... }); } };
6 Réponses :
L'expression régulière attend un fuseau horaire "zoulu" (un caractère "Z 'à la fin), tandis que la chaîne d'échantillonnage de date-date affiche une fuseau horaire numérique (' -04: 00 '). La regex suivante acceptera les deux: p>
Sat Apr 4 15:55:16 PDT 2009
Je peux voir DATEREVIVER () Être touché. Essayez ce qui suit dans un navigateur: p>
<!-- saved from url=(0014)about:internet --> <html> <head> <script src="http://www.json.org/json2.js"></script> <script type="text/javascript" src="http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.js"></script> <script> $(function () { // a mock proxy to return some json to play with var proxy = { getArticle: function(id, foo) { foo({ result: '["2009-04-04T22:55:16.0000000-04:00"]' }); } }; // the origial Site object, with the fixed regex var Site = { dateReviver: function(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; }, loadArticle: function(id) { proxy.getArticle(id, function(response) { var data = JSON.parse(response.result, Site.dateReviver); // put the parsed JSON date on the page $("#output").html(data[0].toString()); }); } }; // try out our Site object Site.loadArticle(); }); </script> </head> <body> <div id="output"></div> </body> </html>
Merci OREN;) Finalement, j'ai découvert le problème avec votre aide. J'utilisais le fichier Json.js fourni avec Jayrock, qui n'accepte pas le paramètre Reviver dans la fonction Payse. Ce que j'ai fait était d'utiliser la méthode d'évaluation à la place pour analyser (c'est là que cela semble bizarre) JSON String: S Je suis plus que reconnaissant;)
Extension du paramètre de convertisseurs JQuery.ajax a fonctionné bien pour moi à partir de sa valeur par défaut: à p>
L'utilisation de n'ajuste pas la date des informations de fuseau horaire, le une alternative est Pour laisser date () faire l'analyse pour vous: p> si le JSON avait été formaté avec JSON.Stringify (), il aurait été dans UTC (z). p> p> retourne nouvelle date (date.utc (+ A [1], + A [2] - 1, + A [3], + A [4], + A [5], + A [5], + a [6])); code>
-4: 00 code> dans l'exemple. p>
Cela essaierait de tout analyser, non seulement des dates. date.parse ("0") && alerte ('échouer') code>
Utilisation de TypeScript, ma solution est la suivante: meilleur de tous les mondes ;-)
Il utilise un dateviver anonyme qui s'appelle Json.parse sur chaque propriété.
La logique REVIVER consiste à vérifier si la propriété est de type chaîne et si oui, si cela ressemble au début d'une date ...
Si c'est une date, laissez la nouvelle date (valeur) faire l'analyse réelle ... toutes les variations de fuseau horaire sont prises en charge de cette façon. P> espère que cela aide! P> P>
function dateReviver (k,v) { var isnum = /^\d+$/.test(v); // Check if number since Date.parse(number) returns valid date if (isnum) { return v; } if (Date.parse(v)) { return new Date(Date.parse(v)); } return v; }
solution de dépose