Make sure that a parsererror is thrown whenever malformed JSON comes back from a server (so that the Ajax error handler is called). Makes it uniform across browsers that do and don't have JSON.parse support.

This commit is contained in:
jeresig 2010-01-07 12:21:58 -05:00
parent c14fa516ae
commit 308d6cdad0
3 changed files with 34 additions and 8 deletions

View file

@ -570,20 +570,26 @@ jQuery.extend({
// The filter can actually parse the response
if ( typeof data === "string" ) {
// If the type is "script", eval it in global context
if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
jQuery.globalEval( data );
}
// Get the JavaScript object, if JSON is used.
if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
// Try to use the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
data = window.JSON.parse( data );
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
} else if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
data = (new Function("return " + data))();
} else {
data = (new Function("return " + data))();
throw "JSON Syntax Error: " + data;
}
// If the type is "script", eval it in global context
} else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
jQuery.globalEval( data );
}
}