无法通过ajax读取json文件

时间:2012-12-13 17:06:36

标签: javascript jquery

在我的代码中我有:

   $.ajax({
       url: 'http://chapters.zmgc.net',
       dataType: 'jsonp',
      success: function(d){   // "Type","Name","Link","Contact","Location","Icon"
        Tabzilla.zgContacts = d;
        var countries = [];
        d.rows.forEach(function(row){
          if (row[0] == 'Country') countries.push(
            {link:row[2], contact:row[3], country: row[4]}
          );     
        });

但是我收到一个错误,Uncaught SyntaxError:意外的令牌:

{
 "kind": "fusiontables#sqlresponse",
....

如果我用实际文件替换url并删除dataType,则所有工作都按预期工作!

我已经在http://chapters.zmgc.net验证了http://jsonlint.com/的输出,这没关系。

查看从http://chapters.zmgc.net返回的响应标头,它是:

Connection:keep-alive
Content-Type:application/json
Date:Thu, 13 Dec 2012 17:02:27 GMT
Transfer-Encoding:chunked

这里是代码https://github.com/tomarcafe/Z-Tabzilla/blob/gh-pages/z-tabzilla.js#L282我想用读取远程数据替换本地文件?

我错过了什么?

3 个答案:

答案 0 :(得分:2)

你不应该将类型设置为jsonp,即带有填充的JSON,因为假设响应被包装在函数调用中。

callback({payload: values});

并将尝试执行。

而是使用type:json,或简称为$.getJSON,它将使用$.parseJSON正确传递JSON有效内容。

答案 1 :(得分:1)

这是因为你要求JSONP(带填充的JSON)并获得没有填充的JSON。 JSONP是由函数调用填充的JSON,使其工作的唯一方法是在服务器上添加对JSONP的支持。

如果您无法访问chapters.zmgc.net,则必须与他们联系并要求他们添加对JSONP的支持。

如果您有访问权限,可以将?callback=parseThis添加到您的网址,然后在服务器端读取该变量并相应地填充您的JSON:

parseThis(/* put your json in here */);

但是,如果你没有定义自己的回调,jQuery会自动添加一个你可以使用的回调。它们看起来像这样:jQuery18200710562220774591_1355419375476

答案 2 :(得分:0)

由于Ajax使用jsonp(带填充的json),但你的url似乎不兼容jsonp,所以你必须避免使用它。

来自jQuery的

  

“jsonp”:使用JSONP加载JSON块。添加一个额外的   “?回调=?”到URL的末尾以指定回调。禁用   通过将查询字符串参数“_ = [TIMESTAMP]”附加到缓存来缓存   URL除非cache选项设置为true。

更多信息:http://bob.ippoli.to/archives/2005/12/05/remote-json-jsonp/