我有一个期望响应JSON的AJAX请求。
但是有可能返回的内容不是JSON,而是一个HTML错误页面(不幸的是,响应类型为200)。
如何判断响应是否为JSON?
(我正在使用jQuery,如果有帮助的话。但我不能使用任何插件。)
我有一个期望响应JSON的AJAX请求。
但是有可能返回的内容不是JSON,而是一个HTML错误页面(不幸的是,响应类型为200)。
如何判断响应是否为JSON?
(我正在使用jQuery,如果有帮助的话。但我不能使用任何插件。)
如果你使用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).
xhr
对象中的content-type
来完成,例如var ct = xhr.getResponseHeader("content-type") || "";
。 - ohhh如果响应是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字符串,并将解析后的值作为回调函数的第一个参数传递。Content-Type:application/json; charset=UTF-8
,可能是因为我使用的是post
而不是get
。 - Yevgeniy Afanasyev似乎try catch很好用:
try {
$.parseJSON(input)
} catch(e) {
// not valid JSON
}
data = '{}';
try {
json = $.parseJSON(data);
} catch (e) {
// not json
}
try {
jQuery.parseJson(json_string_here);
} catch(e) {
... malformed json ...
}