json未捕获的SyntaxError:意外令牌:


69

尝试进行呼叫并检索一个非常简单的一行JSON文件。

$(document).ready(function() {

    jQuery.ajax({ 
        type: 'GET',
        url: 'http://wncrunners.com/admin/colors.json' ,
        dataType: 'jsonp', 
        success: function(data) { 
            alert('success');
        }
    });


  });//end document.ready

这是RAW请求:

GET http://wncrunners.com/admin/colors.json?callback=jQuery16406345664265099913_1319854793396&_=1319854793399 HTTP/1.1
Host: wncrunners.com
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2
Accept: */*
Referer: http://localhost:8888/jquery/Test.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

这是RAW回应:

HTTP/1.1 200 OK
Date: Sat, 29 Oct 2011 02:21:24 GMT
Server: Apache/1.3.33 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d SE/0.5.3
Last-Modified: Fri, 28 Oct 2011 17:48:47 GMT
ETag: "166a2402-10-4eaaeaff"
Accept-Ranges: bytes
Content-Length: 16
Content-Type: text/plain
Connection: close

{"red" : "#f00"}

JSON返回响应(红色:#f00),但Chrome报告Uncaught SyntaxError:Unexpected token:colors.json:1

如果我直接导​​航到url本身,则返回JSON并显示在浏览器中。

如果我将colors.json的内容粘贴到JSLINT中,则json会验证。

有什么想法为什么我无法得到这个错误,并且我也从未成功调用它?

编辑-上面的jQuery.ajax()调用在jsfiddle.net上运行完美,并按预期返回警报“成功”。

编辑2-此URL正常工作'http://api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/q/IA/Cedar_Rapids.json'我注意到它返回为TYPE:text / javascript和Chrome没有抛出意外令牌。我已经测试了其他几个URL,唯一不会抛出Unexptected Token的URL是作为类型返回的文坛:text / javascript。

以text / plain和application / json返回的流未正确解析。


附带说明,我意识到在浏览器中点击url时,“#”实际上并未显示在json中。 wncrunners.com/admin/colors.json
nheinrich

感谢您的输入。我删除了#来测试Keith的理论。删除它不会影响该错误。我还从文件中删除了.json扩展名。同样的错误。
paparush

Answers:


130

您已经告诉jQuery期望JSONP响应,这就是jQuery将callback=jQuery16406345664265099913_1319854793396&_=1319854793399部分添加到URL的原因(您可以在请求的转储中看到它)。

您返回的是JSON,而不是JSONP。您的回应看起来像

{"red" : "#f00"}

jQuery期望这样的事情:

jQuery16406345664265099913_1319854793396({"red" : "#f00"})

如果您实际上需要使用JSONP来绕过相同的原始策略,则服务的服务器colors.json需要能够实际返回JSONP响应。

如果相同的原始政策对于您的应用程序来说不是问题,那么您只需dataTypejQuery.ajax调用中的固定json为即可jsonp


3
谢谢约翰。如果我使用相同的代码并将其指向api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/… ',则响应的确将jQueryxxxx()包裹在json数据中,代码可以正常运行,并且我得到了“成功”警报。我无法更改远程服务器提供JSON文件的方式。如果我使用dataType:'json',那么我得到XMLHttpRequest无法加载isohunt.com/js/json.php?ihq=test。Access-Control-Allow-Origin不允许源localhost:8888
paparush

好的。您提供的Weather Underground URL确实响应JSONP请求。(你会看到这一点,如果你添加?callback=something到URL,当你使用你所得到的错误,dataType: json是因为同源策略的让我加入到我的回答。
约翰平整度

问题似乎确实是如果服务器以Type:text / javascript响应,则Chrome不会发出Uncaught SyntaxError的叫声。如果远程服务器返回以下类型:text / plain或application / json,则Chrome报告Uncaught SyntaxError。
paparush

@John Flatness-谢谢您的解释,非常有用!
Brandt Solovij

谢谢!!这非常有帮助。
westsider 2013年

4

我花了最后几天试图自己解决这个问题。使用旧的json dataType会给您带来跨源问题,而将dataType设置为jsonp会使数据“不可读”,如上所述。因此,显然有两种方法可以解决,第一种方法对我没有用,但似乎是一种潜在的解决方案,而且我可能做错了什么。这在此处[ https://learn.jquery.com/ajax/working-with-jsonp/ ]中进行了说明。

对我有用的工具如下:1-在[ http://www.ajax-cross-origin.com/ ]中下载ajax跨源插件。2-在普通jQuery链接下方添加脚本链接。3-将行“ crossOrigin:true”添加到您的ajax函数中。

好去!这是我的工作代码:

  $.ajax({
      crossOrigin: true,
      url : "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.86,151.195&radius=5000&type=ATM&keyword=ATM&key=MyKey",
      type : "GET",
      success:function(data){
         console.log(data);
      }
    })


1
快速了解一下:该ajax跨源插件使用了Google代理。因此,您要做的就是将数据重新整理到其他人为您编写的代理中。
MetalPhoenix

2

我有同样的问题,解决方法是将json封装在此函数中

jsonp(

....您的json ...


6
您是否封装在服务器端?还是有办法在客户端完成此操作?
Fydo

1

该十六进制可能需要用引号引起来并制成字符串。JavaScript可能不喜欢#字符


基思,谢谢您的答复。为了进行测试,我从文件中删除了#号,以使内容现在为{“ red”:“ f00”},但是仍然存在相同的错误。我注意到的一件事是Response Content-Type是text / plain而不是application / json。
paparush

作为另一项测试,我将文件重命名为只是颜色(无扩展名),并且得到了完全相同的错误。
paparush
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.