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

38

我有一个期望响应JSON的AJAX请求。

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

如何判断响应是否为JSON?

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


为什么它返回的错误信息是那种格式?我认为你应该返回一个带有错误信息的JSON格式,这样你以后就可以轻松解析它。 - Tarik
我无法控制它返回什么。 - jawns317
5个回答

63

如果你使用jQuery并将$.ajax()调用的dataType属性指定为json,那么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).

尝试解析并捕获JSON对象似乎很浪费/奇怪,因为您可以轻松地通过检查xhr对象中的content-type来完成,例如var ct = xhr.getResponseHeader("content-type") || ""; - ohhh
2
因为内容类型不可靠。在JS中检查任意字符串是否为json的唯一可靠方法是尝试解析它并捕获错误。此外,内容类型无法告诉您它是否为有效的json。 - Chad

17

jQuery自动检测数据类型:

如果响应是JSON,一个表现良好的应用程序应该将Content-Type设置为application/json

因此,如果服务器表现良好,您所要做的就是测试响应中的Content-Type标头是否以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字符串,并将解析后的值作为回调函数的第一个参数传递。

1
它对我不起作用,它说dataType = undefined,即使在页面头中我设置了Content-Type:application/json; charset=UTF-8,可能是因为我使用的是post而不是get - Yevgeniy Afanasyev

5

似乎try catch很好用:

try {
   $.parseJSON(input)
} catch(e) {
   // not valid JSON
}

4
jQuery的parseJSON函数可用于此。如果有异常,您可以捕获并继续执行。
data = '{}';
try {
    json = $.parseJSON(data);
} catch (e) {
    // not json
}

非常简单而又聪明。非常适合我的情况。 - Zahari Kitanov

2
try {
    jQuery.parseJson(json_string_here);
} catch(e) {
   ... malformed json ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接