json Uncaught SyntaxError:意外的令牌:

时间:2011-10-29 02:28:38

标签: jquery ajax json syntax-error

尝试拨打电话并检索一个非常简单的一行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会报告未捕获的SyntaxError:意外的令牌:colors.json:1

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

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

任何想法,为什么我不能得到这个错误,我从来没有成功回调?

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

编辑2 - 此网址正常运行'http://api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/q/IA/Cedar_Rapids.json'我注意到它返回TYPE:text / javascript和Chrome没有抛出Unexpected Token。我已经测试了其他几个url,而且只有一个没有抛出Unexptected Token的是wunderground,它返回TYPE:text / javascript。

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

4 个答案:

答案 0 :(得分:129)

你告诉jQuery期待JSONP响应,这就是为什么jQuery已经将callback=jQuery16406345664265099913_1319854793396&_=1319854793399部分添加到URL中(你可以在转储请求时看到这一点)。

你要归的是JSON,而不是JSONP。您的回复类似于

{"red" : "#f00"}

并且jQuery期待这样的事情:

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

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

如果相同的原始政策不适合您的应用,那么您只需要将dataType来电中的jQuery.ajax修改为json而不是jsonp }。

答案 1 :(得分:4)

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

对我有用的一个如下: 1-下载[http://www.ajax-cross-origin.com/]中的ajax cross origin插件。 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);
      }
    })

答案 2 :(得分:2)

我遇到了同样的问题,解决方法是将json封装在这个函数中

JSONP(

....你的json ......

答案 3 :(得分:1)

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