Javascript:如何判断AJAX响应是否为JSON
我收到了一个AJAX请求,该请求需要JSON作为响应 但有一种可能,返回的可能不是JSON,而是HTML错误页面(不幸的是,响应类型为200) 如何判断响应是否为JSONJavascript:如何判断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
(如果有帮助的话,我正在使用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