jQuery ajax返回数据:json和html混合?

时间:2013-12-23 12:13:18

标签: javascript ajax json jquery

我有这个ajax请求来从我的服务器获取数据,默认情况下dataType总是html。但有时它会从服务器返回json,所以我想检查返回的数据是否为html然后执行A else执行B.是否可能?

我的jquery,

 $.ajax({
     type: "GET",
     dataType: "html",
     url: request_url,
     context: $('#meat'),
     async: true,
     beforeSend: function () {},
     success: function (returndata, status, jqXHR) {
         if ($.parseJSON(returndata) === false) A;
         else B.
     }
 });

当返回的数据为html

时,我收到此错误
  

SyntaxError:JSON.parse:意外字符

那我怎样才能使这段代码多才多艺?

3 个答案:

答案 0 :(得分:6)

我不确定是否有更好的方法,但你可以试试......赶上

$.ajax({
      type:       "GET",
      url:        request_url,
      context:    $('#meat'),
      async:      true,
      beforeSend: function() {
      },
      success: function (returndata, status, jqXHR) {
        var parsed;
        try
        {
            parsed = $.parseJSON(returndata);
            // Execute B
        }
        catch(e)
        {
           // treat as html then
           // do parsing here
           parsed = returnData;
           // Execute A
        }
      }

});

答案 1 :(得分:4)

基本上,您的代码完全错误 - 如果返回类型可能以不一致的方式变化,则您的服务器端API违反了所有可预测性原则。您的代码永远不必猜测返回数据的类型。

话虽如此,a simple try/catch如果您不想修复它,将有助于解决不稳定的行为。即

try {
    if ($.parseJSON(returndata) === false) A;
} catch(e) {
    // Treat as HTML here.
}

它并不漂亮,但这就是你得到一个不可预测的API而不是开始的原因。

答案 2 :(得分:-1)

可能你需要像这样处理它

try{
var response=jQuery.parseJSON('response from server');
if(typeof response =='object')
 {
    //control would reach this point if the data is returned as json
 }
 else
 {
    //control would reach this point if data is plain text  
     if(response ===false)
     {
         //the response was a string "false", parseJSON will convert it to boolean false
     }
     else
     {
          //the response was something else
     }
 }
}
catch(exp){
    //controls reaches here, if the data is html
}

由于您还需要检查html数据,您可能需要注意这一点,

如果parseJSON可能会处理除JSON值以外的其他内容(即HTML)

,也可能需要使用try / catch作为异常

<强> REF: How can I check if a value is a json object?

编辑:编辑以使代码更精确地针对解决方案