在jQuery ajax json响应中解析iso日期

Posted

技术标签:

【中文标题】在jQuery ajax json响应中解析iso日期【英文标题】:Parsing iso dates in jQuery ajax json response 【发布时间】:2013-04-17 02:10:29 【问题描述】:

我在以 json 格式解析我的 jQuery-ajax 响应中的日期时遇到问题。

我的客户端代码:

$.ajax(
    url: '/index',
    dataType: 'json',
    success: function (data) 
        console.log(data.date);
    
);

服务器正在发送 json:


    "name": "john",
    "date": "2013-07-01T00:00:00",

运行客户端代码后,我在控制台中收到 string 内容:

2013-07-01T00:00:00

这不是日期类型。我认为这将由解析器完成。我需要做什么才能在 json 解析期间自动解析日期

克里斯

【问题讨论】:

【参考方案1】:

好的,我从http://erraticdev.blogspot.com/2010/12/converting-dates-in-json-strings-using.html找到了一个不错的解决方案:

/*!
 * jQuery.parseJSON() extension (supports ISO & Asp.net date conversion)
 *
 * Version 1.0 (13 Jan 2011)
 *
 * Copyright (c) 2011 Robert Koritnik
 * Licensed under the terms of the MIT license
 * http://www.opensource.org/licenses/mit-license.php
 */
(function ($) 

    // JSON RegExp
    var rvalidchars = /^[\],:\s]*$/;
    var rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]4)/g;
    var rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
    var rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g;
    var dateISO = /\d4-\d2-\d2T\d2:\d2:\d2(?:[.,]\d+)?Z?/i;
    var dateNet = /\/Date\((\d+)(?:-\d+)?\)\//i;

    // replacer RegExp
    var replaceISO = /"(\d4)-(\d2)-(\d2)T(\d2):(\d2):(\d2)(?:[.,](\d+))?Z?"/i;
    var replaceNet = /"\\\/Date\((\d+)(?:-\d+)?\)\\\/"/i;

    // determine JSON native support
    var nativeJSON = (window.JSON && window.JSON.parse) ? true : false;
    var extendedJSON = nativeJSON && window.JSON.parse('"x":9', function(k,v)return "Y";) === "Y";

    var jsonDateConverter = function(key, value) 
        if (typeof(value) === "string") 
            if (dateISO.test(value)) 
                if (value == '0001-01-01T00:00:00') 
                    return null;
                

                return new Date(value);
            
            if (dateNet.test(value))
            
                return new Date(parseInt(dateNet.exec(value)[1], 10));
            
        
        return value;
    ;

    $.extend(
        parseJSON: function(data, convertDates) 
            /// <summary>Takes a well-formed JSON string and returns the resulting javascript object.</summary>
            /// <param name="data" type="String">The JSON string to parse.</param>
            /// <param name="convertDates" optional="true" type="Boolean">Set to true when you want ISO/Asp.net dates to be auto-converted to dates.</param>

            if (typeof data !== "string" || !data) 
                return null;
            

            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = $.trim(data);

            // Make sure the incoming data is actual JSON
            // Logic borrowed from http://json.org/json2.js
            if (rvalidchars.test(data
                .replace(rvalidescape, "@")
                .replace(rvalidtokens, "]")
                .replace(rvalidbraces, "")))
            
                // Try to use the native JSON parser

                if (extendedJSON || (nativeJSON && convertDates !== true))
                
                    return window.JSON.parse(data, convertDates === true ? jsonDateConverter : undefined);
                
                else 
                    data = convertDates === true ?
                        data.replace(replaceISO, "new Date(parseInt('$1',10),parseInt('$2',10)-1,parseInt('$3',10),parseInt('$4',10),parseInt('$5',10),parseInt('$6',10),(function(s)return parseInt(s,10)||0;)('$7'))")
                            .replace(replaceNet, "new Date($1)"):
                        data;
                    return (new Function("return " + data))();
                
             else
            
                $.error("Invalid JSON: " + data);
            
        
    );
)(jQuery);

用法:

$.ajax(
    url: '/index',
    // dataType: 'json', <- remove it
    converters: 
        "text json": function (data) 
            return $.parseJSON(data, true);
        
    ,
    success: function (data) 
        console.log(data.date);
    
);

【讨论】:

你真的只是用了“nice”这个词吗!? ;-D 即使在保留 dataType: "json" 时效果也很好【参考方案2】:

就这样

var myDate = new Date("2013-07-01T00:00:00")

JavaScript 支持开箱即用的 ISO 8601 解析

【讨论】:

但是如果我的 json 响应中有 10000 个具有复杂类型的元素怎么办? 您必须对每一个进行后期处理。这个问题有一些有趣的 cmets 与你的类似:***.com/questions/206384/how-to-format-a-json-date 我正在寻找可以自动解析整个 json 树中日期的东西 你不应该推荐这个。截至 2014 年浏览器之间的解析不一致,旧浏览器将失败,新浏览器仍然不一致(IE 10 没有 TZ):参见 ***.com/questions/5802461/… 和 blog.dygraphs.com/2012/03/javascript-and-dates-what-mess.html

以上是关于在jQuery ajax json响应中解析iso日期的主要内容,如果未能解决你的问题,请参考以下文章

带有json响应的jQuery ajax请求,如何?

在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON

用纯 JavaScript 解析 JSON [重复]

在 jQuery $.ajax 中读取 Laravel JSON 响应

JQuery - $.ajax() - 使用 JSONP 的跨域 - 仅在 IE 8 中获取“解析器错误”(在 IE 7 中工作)

JQuery解析JSON的错误处理