【问题标题】:Ruby: JSON.parse returns undefined method `bytesize' forRuby:JSON.parse 返回未定义的方法“bytesize”
【发布时间】:2025-12-08 09:15:01
【问题描述】:
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"}}]

【问题讨论】:

  • 如果您显示您正在生成/接收的 JSON,这将有所帮助,至少引用 bytesize 的部分。此外,示例的格式很难阅读。请尽量保留控制台上显示的输出。
  • .json 文件有:[{"xpto":{"email":"test@gmail.com"}}]
  • 另外,请重新编辑您的问题并在此处添加信息,而不是在整个页面中穿插在 cmets 中。它确实有助于将所有相关信息保存在一个地方。

标签: ruby json sinatra


【解决方案1】:

这可能是兼容性问题。如果您使用的是 ruby​​1.9,您可能不会遇到这个问题,但如果您使用的是其他版本/实现,例如 ruby​​ 1.8 或 IronRuby,String#bytesize 可能没有定义。

【讨论】:

  • 我正在使用 ruby​​ 1.9.2p180(2011-02-18 修订版 30909)[x86_64-darwin10.6.0]。这应该有效吗?
  • 我明白了。然后是别的东西。您能否发布错误消息以及包括回溯在内的更多信息?
  • @donald undefined method bytesize for 之后是什么?
【解决方案2】:

这很奇怪,因为 response.body 似乎已经是一个哈希了! (即解析的 JSON 字符串),或者,也许您在 webrick 的日志中看到了这一点,因此问题在于 generating JSON 响应,而不是解析它。回溯没有意义:(

【讨论】:

  • 我已经编辑了响应的生成方式。我无法访问我得到的 json 的任何字段。但是,如果我打印 response.body 我有正确的 JSON,我不应该能够访问 response.body["email"] 吗?
  • 你能试着做 puts response.body.class.to_s 和 puts response.body.inspect 。谢谢。关于您的问题 - 不,但 response.body['xpto']['email'] 可能有效。
  • 第一个返回String,第二个"[{\"xpto\":{\"email\":\"test@gmail.com\"}}]"
  • response.body['xpto']['email'] 为空
  • 哦!我知道这里发生了什么。您的 JSON.parse 是方法中的最后一行,它会尝试将其用作响应体!所以实际上 JSON.parse 成功了