jQuery $ .ajax在JSONP响应上调用解析器错误

时间:2012-08-04 04:54:46

标签: jquery ajax json jsonp

嗨!

我正在使用WCF服务来处理来自单独域上的Web服务器的ajax调用(因此使用JSONP)。我的电话看起来像这样:

$.ajax({
    dataType: 'jsonp',
    type: 'GET',
    url: 'http://localhost/s.svc/login?callback=?&l=en&e=foo&p=bar',
    success: function (serverData) {
        // [...]
    },
    error: function (jqXHR, textStatus, errorThrown) {
        // [...]
    }
});

我从服务器获得的响应如下所示:

?({"DataIsValid":true,"ErrorOccurred":false,"EmailAddressValidationMessage":"","PasswordValidationMessage":""});

jQuery在阅读时会抛出 parsererror

上面的响应看起来像有效的JSON,根据文档,我认为“?callback =?”适用于使用JSONP的$ .ajax调用。

提前感谢你指出我显然缺少的东西: - )

2 个答案:

答案 0 :(得分:2)

我在这里看到几件事:

  1. 删除网址中的回调参数。进行jQuery JSONP调用会添加自己的回调,并调用您的成功/错误函数。在后端,从请求中读取“callback”参数并使用它来包装你的jsonp响应(你已经在做它出现的那样 - 所以不要改变那部分)。
  2. 当您进入成功函数时,serverData将是一个字符串。使用jQuery.parseJSON()JSON.parse()
  3. 解析它
      

    var data = jQuery.parseJSON(serverData); //或者使用   JSON.parse(serverData);

    应该这样做。

    最后一件事。如果您开始在解析时遇到“意外令牌...”错误,则可能在JSON字符串中的某处隐藏了一个控制字符。我有这个问题,它是一个换行符(“\ n”)。通过在Chrome的开发工具控制台之类的字符串中解析字符串来确定它是哪个字符,然后替换它:

    var data = jQuery.parseJSON(serverData.replace(/\n/g,""));
    

答案 1 :(得分:0)

我在MVC操作方法响应中丢失了(在回调方法中包装响应)。

response.Write(request.Params["callback"] +"(" +htmlContent +");");

jquery ajax调用应该如下所示。

jQuery.ajax({
           url:"https://servername/virtualDirectory/ActionMethod,               
           crossDomain: true,
            dataType: 'jsonp',                  
            type: 'GET',
            cache: false,
            jsonp:"callback",              
            success: function (data) {   
                alert('success');                
                $fs("#fs_container").htm(data);                   
            },
            error: function (data, status, req) {                          
               alert(req.responseText + " " + status);
            }                 
});