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() 调用 jsondataType 属性,那么 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-typevar 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的主要内容,如果未能解决你的问题,请参考以下文章

javascript如何判断鼠标是不是触发了onmouseover事件

求一个js判断url是不是可用(正常访问)的方法

jQuery Ajax Json 响应 - 检查是不是为空

JavaScript 如何在后台处理 AJAX 响应?

php 怎么判断是不是ajax请求

如何判断 XMLHTTPRequest 是不是命中浏览器缓存