【问题标题】: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 格式的东西,你以后可以很容易地解析它。
  • 我无法控制它返回的内容。

标签: javascript jquery ajax 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 ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2018-10-20
      相关资源
      最近更新 更多