解决微软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 + ')');
}