Javascript:如何判断AJAX响应是否为JSON

Javascript:如何判断AJAX响应是否为JSON,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我收到了一个AJAX请求,该请求需要JSON作为响应 但有一种可能,返回的可能不是JSON,而是HTML错误页面(不幸的是,响应类型为200) 如何判断响应是否为JSON (如果有帮助的话,我正在使用jQuery。但是我不能使用任何插件。)好吧,如果您正在使用jQuery,并且您指定了调用json的dataType属性,那么jQuery将尝试解析json,如果它不是json,则应调用error()回调 $.ajax({ url: '/my/script.ext', dataTyp

我收到了一个AJAX请求,该请求需要JSON作为响应

但有一种可能,返回的可能不是JSON,而是HTML错误页面(不幸的是,响应类型为200)

如何判断响应是否为JSON


(如果有帮助的话,我正在使用jQuery。但是我不能使用任何插件。)

好吧,如果您正在使用jQuery,并且您指定了调用
json
dataType
属性,那么jQuery将尝试解析json,如果它不是json,则应调用
error()
回调

$.ajax({
    url: '/my/script.ext',
    dataType: 'json',
    success: function(data, textStatus, jqXHR) { /*YAYE!!*/ },
    error: function(jqXHR, textStatus, errorThrown) { /*AWWW... JSON parse error*/ }
});

编辑

对于任何不使用jQuery的人,基本思想是尝试将其解析为json并捕获错误:

var data = 'some_data';

try {
    data = JSON.parse(data);
} catch(e) {
    //JSON parse error, this is not json (or JSON isn't in your browser)
}

//act here on the the parsed object in `data` (so it was json).
jQuery自动检测数据类型: 如果响应是JSON,行为正常的应用程序会将
内容类型设置为application/JSON

因此,如果服务器运行良好,您所要做的就是测试响应中的内容类型头是否以application/json开头

碰巧,jQuery本身已经做到了这一点:

$.get('/foo', function(data, status, xhr, dataType) {
    if ('json' === dataType) {
        // Yay that's JSON !
        // Yay jQuery has already parsed `data` 
    }
});

jQuery检测数据类型并将其作为回调函数的第四个参数传递。如果数据类型是JSON,它将解析JSON字符串并解析结果值作为回调的第一个参数。

似乎是try-catch的一个很好的用法:

$.ajax({
    url: '/my/script.ext',
    dataType: 'json',
    success: function(data, textStatus, jqXHR) { /*YAYE!!*/ },
    error: function(jqXHR, textStatus, errorThrown) { /*AWWW... JSON parse error*/ }
});
try {
   $.parseJSON(input)
} catch(e) {
   // not valid JSON
}

jQuery parseJSON函数可用于此目的。它将抛出一个异常,然后您可以捕获它并继续

data = '{}';
try {
    json = $.parseJSON(data);
} catch (e) {
    // not json
}

为什么它会以这种格式返回错误消息?我认为您应该返回JSON格式的内容,并提供错误信息,以后可以轻松解析。我无法控制它返回的内容。如果您可以轻松地从
xhr
对象中检查
内容类型,比如
var-ct,那么尝试解析并捕获JSON对象似乎是一种巨大的浪费/怪异=xhr.getResponseHeader(“内容类型”)||“”因为内容类型不可靠。检查任意字符串在JS中是否为json的唯一可靠方法是尝试并解析它,然后捕获错误。此外,内容类型不会告诉您它是否是有效的json。非常简单,但很聪明。非常适合我的情况。它不适合我,它说dataType=undefined,甚至在我设置的页面标题
Content-Type:application/json;charset=UTF-8
,可能是因为我使用的是
post
而不是
get