#ruby #json #sinatra
#ruby #json #синатра
Вопрос:
response = Typhoeus::Request.get("http://localhost:3000/api/api_email/#{@api_id}.json")
JSON.parse(response.body)
Ответ представляет собой объект JSON, но я получаю ошибку при попытке его синтаксического анализа.
undefined method `bytesize' for
Я хочу получить доступ к объекту JSON.
Ошибка:
NoMethodError at /api/v1/a71040739d6cc50e89aff56601af67/2011-10-1
undefined method `bytesize' for {"xpto"=>{"email
"=>"test@gmail.com"}}:Hash
file: utils.rb location: bytesize line: 239
Обратная трассировка:
/Users/donald/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/1.9.1/webrick/httpserver.rb in service
si.service(req, res)
/Users/donald/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/1.9.1/webrick/httpserver.rb in run
server.service(req, res)
/Users/donald/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/1.9.1/webrick/server.rb in block in start_thread
block ? block.call(sock) : run(sock)
Вот как генерируется:
@api_id = params[:api_id]
@bucket = Bucket.where(:api => @api_id)
respond_with(@bucket, :only => [:email])
Возвращаемый файл .json содержит:
[{"xpto":{"email":"test@gmail.com"}}]
Комментарии:
1. Было бы полезно, если бы вы показывали JSON, который вы генерируете / получаете, по крайней мере, раздел, на который ссылаются
bytesize
. Кроме того, форматирование примеров трудно прочитать. Пожалуйста, постарайтесь сохранить выходные данные в точности в том виде, в каком они отображаются на вашей консоли.2. Файл .json содержит: [{«xpto»:{«email»:»test@gmail.com «}}]
3. Кроме того, пожалуйста, отредактируйте свой вопрос и добавьте информацию туда, а не разбрасывайте комментарии по всей странице. Это действительно помогает хранить всю необходимую информацию в одном месте.
Ответ №1:
Это странно, так как кажется, что ответ.тело уже является хэшем! (т. Е. проанализированной строкой JSON), или, возможно, вы видите это в журнале вашего веб-каталога, и, следовательно, проблема заключается в генерации ответа JSON, а не в его разборе. Обратная трассировка не имеет смысла : (
Комментарии:
1. Я отредактировал способ генерации ответа. Я не могу получить доступ ни к одному полю json, который я получаю. Однако, если я напечатаю ответ. body У меня есть JSON правильно, разве я не должен иметь доступ к response.body[«электронная почта»]?
2. Можете ли вы попробовать сделать puts response.body.class.to_s и puts response.body.inspect . Спасибо. А что касается вашего вопроса — нет, но response.body[‘xpto’][’email’] может сработать.
3. Первый возвращает строку, второй «[{«xpto»:{«email»:»test@gmail.com «}}]»
4. ответ.body[‘xpto’][’email’] пуст
5. о! Я знаю, что здесь происходит. Ваш JSON.parse является последней строкой в методе, и он пытается использовать ее в качестве тела ответа! Итак, на самом деле JSON.parse удался
Ответ №2:
Вероятно, это проблема совместимости. Вероятно, у вас не возникнет этой проблемы, если вы используете ruby1.9, но если вы используете другие версии / реализации, такие как ruby 1.8 или IronRuby, String#bytesize
может быть не определен.
Комментарии:
1. Я использую ruby 1.9.2p180 (редакция 30909 2011-02-18) [x86_64-darwin10.6.0]. Должно ли это сработать?
2. Я понимаю. Тогда это что-то другое. Можете ли вы опубликовать сообщение об ошибке с дополнительной информацией, включая обратную трассировку?
3. @donald Что будет после
undefined method bytesize for
?