Jquery getJSON Uncaught SyntaxError: Неожиданный токен: ошибка - PullRequest
1 голос
/ 06 июля 2011

Я пытаюсь подключиться к 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 ]

8 голосов
/ 06 июля 2011

С чего вы взяли, что rubygems.org вообще поддерживает JSONP?Я не вижу никакого упоминания о 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'

Единственное различие между ними заключается в изменении downloads и version_downloads, но это ожидаемо.

Когда вы используете jsoncallback=? в строке запроса, jQuery настроит функцию обратного вызова иПредположим, что удаленный URL отправит обратно JavaScript (не JSON!), который вызовет указанную функцию.Таким образом, если удаленный сервис отправляет обратно JSON, когда вы ожидаете JavaScript, браузер в конечном итоге попытается интерпретировать JSON как JavaScript и расстроится, потому что

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

не является допустимым оператором JavaScript.Это похоже на ошибку, которую вы видите.

Я думаю, вам придется проксировать JSON через ваш собственный сервер.Вам понадобится контроллер на вашем сервере, который делает вызов для получения JSON, а затем просто возвращает его обратно в ваш JavaScript, это поможет вам обойтись как без поддержки JSONP, так и с вашей проблемой междоменных областей в вашем клиенте.

2 голосов
/ 06 июля 2011

Браузер интерпретирует фигурные скобки как блок.API должен возвращать вызов функции с данными JSON в качестве аргумента (используя предоставленное имя обратного вызова).Похоже, этот API не поддерживает JSONP и параметр обратного вызова, поэтому вам нужно связаться с ними, чтобы запросить эту поддержку.

Он должен возвращать что-то вроде:

jsonp1279196981233({ ... })

чем просто:

{ ... }

, потому что клиент будет оценивать его как скрипт.В JavaScript набор отдельных фигурных скобок будет обозначать блок.

0 голосов
/ 04 июня 2013

Related ... Если вы не вернете действительный 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
  }
]
0 голосов
/ 06 июля 2011

Учитывая, что вы передаете функцию обработчика данных в getJSON(), вы уверены, что хотите параметр обратного вызова JSONP? Попробуйте удалить ?jsoncallback=? из URL:

.getJSON("http://rubygems.org/api/v1/gems/rails.json", function(data) {
    ...function stuff....
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...