解决微软MVC请求响应的JSON的日期格式问题。需要结合StringBuilder

JavaScriptSerializer = {};
JavaScriptSerializer._charsToEscapeRegExs = [];
JavaScriptSerializer._charsToEscape = [];
JavaScriptSerializer._dateRegEx = new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\+|-)[0-9]{4})?\\)\\\\/\\"', 'g');
JavaScriptSerializer._escapeChars = {};
JavaScriptSerializer._escapeRegEx = new RegExp('["\\\\\\x00-\\x1F]', 'i');
JavaScriptSerializer._escapeRegExGlobal = new RegExp('["\\\\\\x00-\\x1F]', 'g');
JavaScriptSerializer._jsonRegEx = new RegExp('[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]', 'g');
JavaScriptSerializer._jsonStringRegEx = new RegExp('"(\\\\.|[^"\\\\])*"', 'g');
JavaScriptSerializer._init = function () {
    var replaceChars = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007',
                        '\\b', '\\t', '\\n', '\\u000b', '\\f', '\\r', '\\u000e', '\\u000f', '\\u0010', '\\u0011',
                        '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019',
                        '\\u001a', '\\u001b', '\\u001c', '\\u001d', '\\u001e', '\\u001f'];
    JavaScriptSerializer._charsToEscape[0] = '\\';
    JavaScriptSerializer._charsToEscapeRegExs['\\'] = new RegExp('\\\\', 'g');
    JavaScriptSerializer._escapeChars['\\'] = '\\\\';
    JavaScriptSerializer._charsToEscape[1] = '"';
    JavaScriptSerializer._charsToEscapeRegExs['"'] = new RegExp('"', 'g');
    JavaScriptSerializer._escapeChars['"'] = '\\"';
    for (var i = 0; i < 32; i++) {
        var c = String.fromCharCode(i);
        JavaScriptSerializer._charsToEscape[i + 2] = c;
        JavaScriptSerializer._charsToEscapeRegExs[c] = new RegExp(c, 'g');
        JavaScriptSerializer._escapeChars[c] = replaceChars[i];
    }
}
JavaScriptSerializer.serialize = function (object) {
    var stringBuilder = new StringBuilder();
    var booleanWithBuilder = function (bool, builder) {
        if (typeof bool !== 'undefined') {
            builder.append(bool);
        } else {
            builder.append('false');
        }
    }
    var numberWithBuilder = function (number, builder) {
        if (typeof number !== 'undefined' && number.toString() !== 'NaN') {
            builder.append(number);
        } else {
            builder.append('null');
        }
    }
    var stringWithBuilder = function (string, builder) {
        builder.append('"');
        if (JavaScriptSerializer._escapeRegEx.test(string)) {
            if (JavaScriptSerializer._charsToEscape.length === 0) {
                JavaScriptSerializer._init();
            }
            if (string.length < 128) {
                string = string.replace(JavaScriptSerializer._escapeRegExGlobal,
                function (x) { return JavaScriptSerializer._escapeChars[x]; });
            }
            else {
                for (var i = 0; i < 34; i++) {
                    var c = JavaScriptSerializer._charsToEscape[i];
                    if (string.indexOf(c) !== -1) {
                        if ($.browser.opera || $.browser.mozilla) {
                            string = string.split(c).join(JavaScriptSerializer._escapeChars[c]);
                        }
                        else {
                            string = string.replace(JavaScriptSerializer._charsToEscapeRegExs[c],
                            JavaScriptSerializer._escapeChars[c]);
                        }
                    }
                }
            }
        }
        builder.append(string);
        builder.append('"');
    }
    var dateWithBuilder = function (date, builder) {
        if (date && date.toString() !== 'NaN') {
            builder.append('"\\/Date(');
            var timeOffset = date.getTimezoneOffset() * 60 * 1000;
            if (timeOffset != 0) {
                var time = date.getTime() - timeOffset;
                builder.append(time);
            }
            else {
                builder.append(date.getTime());
            }
            builder.append(')\\/"');
        } else {
            builder.append('null');
        }
    }
    var plainObjectWithBuilder = function (plainObject, builder) {
        builder.append('{');
        var row = 0;
        for (var item in plainObject) {
            if (row++ > 0) {
                builder.append(',');
            }
            stringWithBuilder(item, builder);
            builder.append(':');
            withBuilder(plainObject[item], builder);
        }
        builder.append('}');
    }
    var arrayWithBuilder = function (array, builder) {
        if (array) {
            builder.append('[');
            if (array.length > 0) {
                $.each(array, function (i, item) {
                    if (i > 0) {
                        builder.append(',');
                    }
                    withBuilder(item, builder);
                });
            }
            builder.append(']');
        } else {
            builder.append('null');
        }
    }
    var withBuilder = function (object, builder) {
        builder = builder || new StringBuilder();
        var type = $.type(object);
        switch (type) {
            case 'object':
                if (object) {
                    if (jQuery.isPlainObject(object)) {
                        plainObjectWithBuilder(object, builder);
                    } else {
                        builder.append('null');
                    }
                } else {
                    builder.append('null');
                }
                break;
            case 'array':
                arrayWithBuilder(object, builder);
                break;
            case 'number':
                numberWithBuilder(object, builder);
                break;
            case 'string':
                stringWithBuilder(object, builder);
                break;
            case 'date':
                dateWithBuilder(object, builder);
                break;
            case 'boolean':
                booleanWithBuilder(object, builder);
                break;
            default:
                builder.append('null');
                break;
        }
    }

    withBuilder(object, stringBuilder);

    return stringBuilder.toString();
}
JavaScriptSerializer.deserialize = function (data, secure) {
    if (data == null || typeof data !== "string" || data.length === 0) {
        return null;
    }
    var exp = data.replace(JavaScriptSerializer._dateRegEx, "$1new Date($2)");
    try {
        if (secure && JavaScriptSerializer._jsonRegEx.test(exp.replace(JavaScriptSerializer._jsonStringRegEx, ''))) {
            throw null;
        }
    } catch (e) {
        throw 'Cannot deserialize. The data does not correspond to valid JSON.';
    }
    return eval('(' + exp + ')');
}