Jquery getJSON Uncaught SyntaxError:意外的令牌:错误

时间:2011-07-06 01:24:01

标签: javascript json jquery

我正在尝试连接到RubyGems API,但是当我尝试获取JSON时,我收到了一个错误。

Uncaught SyntaxError: Unexpected token :

我在其他问题和帖子中看到过这个错误,但没有一个对我有用。

这是我的$ .getJSON()函数

.getJSON("http://rubygems.org/api/v1/gems/rails.json?jsoncallback=?", function(data) {
  ...function stuff....
});

这是我应该收到的JSON:

{"dependencies":{"runtime":[{"name":"actionmailer","requirements":"= 3.0.9"},{"name":"actionpack","requirements":"= 3.0.9"},{"name":"activerecord","requirements":"= 3.0.9"},{"name":"activeresource","requirements":"= 3.0.9"},{"name":"activesupport","requirements":"= 3.0.9"},{"name":"bundler","requirements":"~> 1.0"},{"name":"railties","requirements":"= 3.0.9"}],"development":[]},"name":"rails","downloads":4474748,"info":"Ruby on Rails is a full-stack web framework optimized for programmer happiness and sustainable productivity. It encourages beautiful code by favoring convention over configuration.","version_downloads":93309,"version":"3.0.9","homepage_uri":"http://www.rubyonrails.org","bug_tracker_uri":"http://rails.lighthouseapp.com/projects/8994-ruby-on-rails","source_code_uri":"http://github.com/rails/rails","gem_uri":"http://rubygems.org/gems/rails-3.0.9.gem","project_uri":"http://rubygems.org/gems/rails","authors":"David Heinemeier Hansson","mailing_list_uri":"http://groups.google.com/group/rubyonrails-talk","documentation_uri":"http://api.rubyonrails.org","wiki_uri":"http://wiki.rubyonrails.org"}

有人可以帮助我:)

4 个答案:

答案 0 :(得分:8)

是什么让你认为rubygems.org支持JSONP?我在the documentation中没有看到JSONP的提及,当我这样做时:

lynx -dump -source 'http://rubygems.org/api/v1/gems/rails.json?jsoncallback=x'

我从

获得了与我相同的普通旧JSON
lynx -dump -source 'http://rubygems.org/api/v1/gems/rails.json'

两者之间的唯一区别是downloadsversion_downloads更改,但这是预期的。

在查询字符串中使用jsoncallback=?时,jQuery将设置一个回调函数,并假设远程URL将发送将调用指定函数的JavaScript(而不是JSON!)。因此,如果远程服务在您期待JavaScript时发送回JSON,浏览器将最终尝试将JSON解释为JavaScript并因此而感到不安,因为

{"dependencies":{"runtime":[{"name":"action ...

不是有效的JavaScript语句。这听起来就像你看到的错误。

我认为您将不得不通过自己的服务器代理JSON。您需要在服务器上使用一个控制器来调用JSON,然后简单地将其回传给您的JavaScript,这将解决您的客户端缺少JSONP支持和跨域问题。 / p>

答案 1 :(得分:2)

浏览器将大括号解释为块。 API需要以JSON数据作为参数返回函数调用(使用提供的回调名称)。该API似乎不支持JSONP&回调参数,所以你需要联系他们以寻求这种支持。

应该返回类似的内容:

jsonp1279196981233({ ... })

而不是简单地:

{ ... }

因为客户端会将其评估为脚本。在JavaScript中,一组独立的花括号将表示一个块。

答案 2 :(得分:0)

鉴于您将数据处理函数传递给getJSON(),您确定要使用JSONP回调参数吗?尝试从网址中删除?jsoncallback=?

.getJSON("http://rubygems.org/api/v1/gems/rails.json", function(data) {
    ...function stuff....
});

答案 3 :(得分:0)

相关...如果你没有返回有效的JSON,你会看到这个错误,JSONP放在一边。

对我来说,我是

format.json { render :json => ActiveSupport::JSON.encode({:foo => true}) :status => :ok }
=>
{
  'foo': true
}

我什么时候应该

format.json { render :json => ActiveSupport::JSON.encode([{:foo => true}]) :status => :ok }
=>
[
  {
    'foo': true
  }
]