Jquery json未捕获语法错误:意外标记:

Jquery json未捕获语法错误:意外标记:,jquery,ajax,json,syntax-error,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');

尝试调用并检索一个非常简单的一行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
以下是原始请求:

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
以下是原始的回答:

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报告未捕获的语法错误:意外标记:颜色。JSON:1

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

如果我将colors.json的内容粘贴到JSLINT中,json将进行验证

你知道为什么我不能得到这个错误,而我从来没有成功回调吗

EDIT-上面的jQuery.ajax()调用在jsfiddle.net上运行良好,并按预期返回警报“success”

编辑2-此URL工作正常'http://api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/q/IA/Cedar_Rapids.json我注意到它以TYPE:text/javascript返回,Chrome没有抛出意外的标记。我已经测试了其他几个url,唯一一个没有抛出未排除标记的url是返回类型为text/javascript的wunderground


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

十六进制可能需要用引号括起来并生成字符串。Javascript可能不喜欢您告诉jQuery期待响应的#字符

,这就是为什么jQuery在URL中添加了
callback=jquery16406345664265099131319854793396&=1319854793399
部分(您可以在请求的转储中看到这一点)

返回的是JSON,而不是JSONP。你的回答看起来像

{"red" : "#f00"}
jQuery希望看到这样的情况:

jQuery16406345664265099913_1319854793396({"red" : "#f00"})
如果您确实需要使用JSONP来绕过同源策略,那么提供
colors.json
服务的服务器需要能够实际返回JSONP响应


如果同源策略对您的应用程序来说不是问题,那么您只需要修复
jQuery.ajax
调用中的
dataType
,将
json
替换为
jsonp
,我也遇到了同样的问题,解决方案是将json封装在这个函数中

jsonp(

…你的json


)

过去几天我一直在努力自己解决这个问题。使用旧的json数据类型会带来跨源问题,而将数据类型设置为jsonp会使数据“无法读取”,如上所述。因此,显然有两种解决方法,第一种方法对我不起作用,但似乎是一种潜在的解决办法,我可能做错了什么。此处对此进行了解释[]

对我有效的方法如下: 1-下载ajax跨源插件[]。 2-在普通jQuery链接的正下方添加一个脚本链接。 3-在ajax函数中添加一行“crossOrigin:true”

很好!以下是我的工作代码:

$.ajax({
交叉起源:对,
url:“https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.86151.195&radius=5000&type=ATM&keyword=ATM&key=MyKey“,
键入:“获取”,
成功:功能(数据){
控制台日志(数据);
}

})
Keith,谢谢你的回复。为了测试,我从文件中删除了#符号,使得内容现在是{“red”:“f00”},但同样的错误仍然存在。我注意到的一点是,响应内容类型是text/plain,而不是application/json。作为另一个测试,我将文件重命名为colors(没有扩展名),得到了完全相同的错误。我注意到,在浏览器中点击url时,json中实际上没有显示“#”。谢谢你的意见。我去掉了#来测试基思的理论。删除它不会影响错误。我还从文件中删除了.json扩展名。同样的错误,谢谢约翰。如果我使用相同的代码并将其指向“json”,那么响应确实会将JQueryxxx()包装在json数据周围,代码运行良好,我会收到“成功”警报。我无法更改远程服务器提供JSON文件的方式。如果我使用数据类型:“json”,那么我得到的XMLHttpRequest无法加载。Access-Control-Allow-Origin不允许使用原点。好的。您提供的Weather Underground URL不会响应JSONP请求。(如果您将
?callback=something
添加到该URL,您将看到这一点。使用
数据类型:json
时出现的错误是由于同源策略。让我补充一下我的答案。问题似乎是,如果服务器响应类型为text/javascript,那么Chrome不会对未捕获的语法错误发出吠声。如果服务器返回类型:text/plain或application/json,然后Chrome报告未捕获的SyntaxError。@John Flatness-感谢您的解释,非常有用!谢谢!!这非常有用。您是在服务器端进行封装吗?还是有办法在客户端完成此操作?快速提示:ajax跨源插件使用的谷歌代理。所以你所做的就是把你的数据转移到别人为你写的代理上。