json Uncaught SyntaxError:意外令牌:

json Uncaught SyntaxError: Unexpected token :

提问人:paparush 提问时间:10/29/2011 最后编辑:paparush 更新时间:4/7/2017 访问量:135413

问:

尝试进行调用并检索一个非常简单的一行 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 的是作为 TYPE: text/javascript 返回的 wunderground。

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

jquery ajax json 语法错误

评论

0赞 nheinrich 10/29/2011
附带说明,我意识到在浏览器中点击网址时,“#”实际上并没有显示在 json 中。wncrunners.com/admin/colors.json
0赞 paparush 10/30/2011
感谢您的输入。我删除了 # 来测试 Keith 的理论。删除它不会影响错误。我还从文件中删除了 .json 扩展名。同样的错误。

答:

1赞 Keith.Abramo 10/29/2011 #1

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

评论

0赞 paparush 10/29/2011
基思,谢谢你的回复。为了测试,我从文件中删除了 # 符号,使内容现在为 {“red” : “f00”},但相同的错误仍然存在。我注意到的一件事是响应 Content-Type 是 text/plain 而不是 application/json。
0赞 paparush 10/29/2011
作为另一个测试,我将文件重命名为仅颜色(没有扩展名),并且出现完全相同的错误。
130赞 John Flatness 10/30/2011 #2

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

您返回的是 JSON,而不是 JSONP。您的回复如下所示

{"red" : "#f00"}

jQuery期待这样的结果:

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

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

如果同源策略对应用程序来说不是问题,则只需将调用中的 be 而不是 .dataTypejQuery.ajaxjsonjsonp

评论

3赞 paparush 10/30/2011
谢谢约翰。如果我使用相同的代码并将其指向 api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/...,则响应确实将 jQueryxxxx() 包裹在 json 数据周围,代码运行良好,并且我收到”成功“警报。我无法更改远程服务器提供 JSON 文件的方式。如果我使用 dataType: 'json',那么我得到 XMLHttpRequest 无法加载 isohunt.com/js/json.php?ihq=test。Access-Control-Allow-Origin 不允许 Origin localhost:8888
0赞 John Flatness 10/30/2011
好。您提供的 Weather Underground URL 确实响应了 JSONP 请求。(如果您添加到该 URL,则会看到此内容。使用时遇到的错误是由于同源策略造成的。让我补充一下我的答案。?callback=somethingdataType: json
0赞 paparush 10/30/2011
问题似乎真的是,如果服务器响应 Type: text/javascript,那么 Chrome 就不会对 Uncaught SyntaxError 咆哮。如果远程服务器返回 type: text/plain 或 application/json,则 Chrome 会报告 Uncaught SyntaxError。
0赞 Amit Rana 7/27/2013
@JohnFlatness感谢您的解释,我有同样的问题,但我无法更改我的服务器代码,我必须在我的客户端调用任何有助于解决此问题的建议或 js,没有 jsonp 跨域错误,所以需要使用 jsonp 这里是我的问题的小提琴 jsfiddle.net/waamit14/wZSeB
2赞 user1510230 7/18/2012 #3

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

jsonp(

....你的 json ...

)

评论

6赞 Fydo 1/28/2014
您是否在服务器端封装?或者有没有办法在客户端完成此操作?
4赞 S. Rehan 11/24/2016 #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);
      }
    })

评论

1赞 user4593252 3/20/2018
快速提醒:ajax 跨域插件使用谷歌代理。因此,您所要做的就是将数据洗牌到其他人为您编写的代理中。