如何在jQuery的.ajax()方法中覆盖严格的JSON解析?

时间:2017-06-14 22:15:39

标签: jquery json ajax

从jQuery 1.9开始,如果在调用dataType: json时指定.ajax,但无法将响应主体成功解析为JSON,则请求将无提示失败:

  

以严格的方式解析JSON数据;任何格式错误的JSON都会被拒绝,并抛出一个解析错误。从jQuery 1.9开始,空响应也被拒绝;服务器应该返回null或{}的响应。

换句话说,即使服务器返回成功代码,jQuery仍会考虑请求"失败"如果响应不包含有效的JSON。因此,它将解析.fail()回调而不是.done()回调。

如何覆盖此行为,以便jQuery将请求解释为成功(并调用.done()),即使它无法正确解析响应正文?

2 个答案:

答案 0 :(得分:1)

.ajax使用的JSON解析器(内置浏览器解析器和jQuery解析器)如果无法解析响应,将throw an exception。此异常是触发.fail()的原因。

要覆盖此行为,您需要定义custom converter以在处理您期望作为JSON的响应时捕获此异常:

$.ajax({
    // We're expecting a JSON response...
    dataType: 'json',

    // ...but we need to override jQuery's strict JSON parsing
    converters: {
        'text json': function(result) {
            try {
                // First try to use native browser parsing
                if (typeof JSON === 'object' && typeof JSON.parse === 'function') {
                    return JSON.parse(result);
                } else {
                    // Fallback to jQuery's parser
                    return $.parseJSON(result);
                }
            } catch (e) {
               // Whatever you want as your alternative behavior, goes here.
               // In this example, we send a warning to the console and return 
               // an empty JS object.
               console.log("Warning: Could not parse expected JSON response.");
               return {};
            }
        }
    },

    ...

答案 1 :(得分:-2)

请勿使用dataType: 'json'。使用dataType: 'text'并在JSON.parse()success:回调中明确致电.done()。如果JSON无效,您可以将其包装在try/except中以捕获错误。

如果您需要在没有此选项的情况下发送Accept: application/json,请尝试使用:

headers: { Accept: 'application/json' }

beforeSend: function(jqXHR, options) {
    jqXHR.setRequestHeader('Accept', 'application/json');
}