7
votes

Comment utiliser le paramètre JSON.PARSE REVIVER à la chaîne de date d'analyse

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);
        ....
    });
}
};


0 commentaires

6 Réponses :


6
votes
  1. 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
    
  2. 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>
    

1 commentaires

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;)



3
votes

Extension du paramètre de convertisseurs JQuery.ajax a fonctionné bien pour moi à partir de sa valeur par défaut: xxx

à xxx


0 commentaires

2
votes

L'utilisation de retourne nouvelle date (date.utc (+ A [1], + A [2] - 1, + A [3], + A [4], + A [5], + A [5], + a [6]));

n'ajuste pas la date des informations de fuseau horaire, le -4: 00 dans l'exemple.

une alternative est Pour laisser date () faire l'analyse pour vous: xxx

si le JSON avait été formaté avec JSON.Stringify (), il aurait été dans UTC (z).


1 commentaires

Cela essaierait de tout analyser, non seulement des dates. date.parse ("0") && alerte ('échouer')



9
votes

Utilisation de TypeScript, ma solution est la suivante: xxx

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.

espère que cela aide!


0 commentaires

0
votes
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;
}

0 commentaires

0
votes

solution de dépose xxx


0 commentaires