Javascript:如何判断 AJAX 响应是不是为 JSON
Posted
技术标签:
【中文标题】Javascript:如何判断 AJAX 响应是不是为 JSON【英文标题】:Javascript: How to tell whether AJAX response is JSONJavascript:如何判断 AJAX 响应是否为 JSON 【发布时间】:2011-11-09 10:18:21 【问题描述】:我有一个 AJAX 请求,它需要 JSON 作为响应。
但有可能返回的不是 JSON,而是 html 错误页面(不幸的是,响应类型为 200)。
如何判断响应是否为 JSON?
(我正在使用 jQuery,如果有帮助的话。但我不能使用任何插件。)
【问题讨论】:
为什么它会返回那种格式的错误信息?我认为你应该返回一些带有错误的 JSON 格式的东西,你以后可以很容易地解析它。 我无法控制它返回的内容。 【参考方案1】:好吧,如果您使用的是 jQuery,并且您指定了 $.ajax()
调用 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).
【讨论】:
当您可以轻松地从xhr
对象中检查content-type
与var ct = xhr.getResponseHeader("content-type") || "";
之类的东西时,尝试解析然后捕获json 对象似乎是一个很大的浪费/奇怪/跨度>
因为内容类型不可靠。在 JS 中检查任意字符串是否为 json 的唯一可靠方法是尝试解析它,然后捕获错误。此外,内容类型不会告诉您它是否是 valid json.【参考方案2】:
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 检测数据类型并将其作为回调函数的第四个参数传递。如果 dataType 是 JSON,它会解析 JSON 字符串并将结果值解析为回调的第一个参数。
【讨论】:
它对我不起作用,它说 dataType = undefined 甚至在我设置的页眉中想到了Content-Type:application/json; charset=UTF-8
,可能是因为我使用的是post
而不是get
跨度>
【参考方案3】:
似乎很好地使用了try catch:
try
$.parseJSON(input)
catch(e)
// not valid JSON
【讨论】:
【参考方案4】:jQuery parseJSON 函数可用于此。它会抛出一个异常,然后你可以抓住它继续前进。
data = '';
try
json = $.parseJSON(data);
catch (e)
// not json
【讨论】:
非常简单而聪明。非常适合我的情况。【参考方案5】:try
jQuery.parseJson(json_string_here);
catch(e)
... malformed json ...
【讨论】:
以上是关于Javascript:如何判断 AJAX 响应是不是为 JSON的主要内容,如果未能解决你的问题,请参考以下文章