Ruby: JSON.parse возвращает неопределенный метод `bytesize’ для

#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 ?