How to use JSON.parse reviver parameter to parse date string How to use JSON.parse reviver parameter to parse date string json json

How to use JSON.parse reviver parameter to parse date string


Using TypeScript, my solution is as follows:

    export function parseWithDate(jsonString: string): any {    var reDateDetect = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/;  // startswith: 2015-04-29T22:06:55    var resultObject = JSON.parse(jsonString,(key: any, value: any) => {        if (typeof value == 'string' && (reDateDetect.exec(value))) {            return new Date(value);        }        return value;    });    return resultObject;}

Best of all worlds ;-)It uses an anonymous datereviver, which gets called by JSON.parse on each property.The reviver logic is to check whether the property is of type string and if so, whether it looks like the start of a date ...If it is a date, then let new Date(value) do the actual parsing ... all timezone variations are supported that way.

Hope it helps!


  1. The regular expression expects a "Zulu" timezone (A 'Z' character at the end), while the sample date-time string shows a numeric timezone ('-04:00'). The following regex will accept both:

    /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/

    If the time zone digits are not zero, you might want to actually modify the date after parsing and/or converting to UTC, to respect the timezone.

  2. I can see dateReviver() being hit. Try the following in a browser:

    <!-- 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>

    I am getting the following in the browser, indicating successful parsing:

    Sat Apr 4 15:55:16 PDT 2009


Extending the jQuery.ajax converters setting worked fine for me from its's default:

"text json": jQuery.parseJSON

to

"text json": function (xmlValue) {            var value = JSON.parse(xmlValue, Site.dateReviver);      return value;      }