【问题标题】:Trouble handling HTTP responses and parsing JSON data处理 HTTP 响应和解析 JSON 数据时出现问题
【发布时间】:2011-07-12 09:51:10
【问题描述】:

我正在使用 Ruby on Rails 3,我想用以下代码解决一个问题,即 Web 客户端应用程序从使用 Rack 中间件的 Web 服务应用程序接收一些 JSON 数据以进行响应。

在我拥有的网络客户端应用程序模型中

response_parsed = JSON.parse(response.body)
if response_parsed["account"]
  ...
else
  return response
end

在上面的代码中,response.body 来自使用 Rack 中间件响应 Web 客户端的 Web 服务应用程序:

accounts = Account.where(:id => ids)
[200, {'Content-Type' => 'application/json'}, accounts.to_json] # That is, response.body = accounts.to_json

数据传输正常,但出现以下错误

TypeError
can't convert String into Integer

*Application Trace* 
lib/accounts.rb:107:in `[]'

107这一行对应

if response_parsed["account"]
  ...

问题出在哪里?如何解决?


如果我尝试调试 respons.body 我会得到

# Note: this is an array!
"[{\"account\":{\"firstname\":\"Semio\",\"lastname\":\"Iaven\"\"}}]"

【问题讨论】:

    标签: ruby-on-rails ruby json http parsing


    【解决方案1】:

    如果我说的是你已经意识到的事情,请原谅我。

    看起来您的响应是一个单元素数组,其中包含一个哈希作为第一个元素。因为响应是一个数组,所以当您使用 [] 时,它需要一个整数,表示您要访问的数组中项目的索引,这就是错误消息的含义——它预计您会告诉它你想要的项目的整数值,但是你给了它一个字符串。

    如果你这样做:

    response_parsed[0]['account']
    

    看来你会得到你想要的。

    【讨论】:

    • 为什么 web 服务输出是一个数组而不是一个散列?我想像在其他类似情况下一样返回一个哈希值。
    • 在我看来,accounts = Account.where(:id => ids) 会返回一个结果数组。 “ids”似乎暗示你可以在那里传递一个有效id的数组。仅仅因为恰好只有一个并不意味着该函数将停止将结果作为数组返回。不过,这只是我的怀疑。
    • 对不起,我错了。为了使我的代码正常工作,也许我必须有一个"{\"account\":{\"firstname\":\"Semio\",\"lastname\":\"Iaven\"\"}}" 而不是"[{\"account\":{\"firstname\":\"Semio\",\"lastname\":\"Iaven\"\"}}]" 的Web 服务响应。但是 Web 服务应该在 response.body? 中简单地返回一个 JSON 字符串?
    • 如果您要求一个对象数组将其自身输出到 json,您会得到一个 json 字符串,该字符串表示一个数组,其中每个对象的 json 哈希作为数组项。它仍然是一个字符串。当您传输并稍后使用该 json 字符串时,它会再次为您提供一个数组。
    猜你喜欢
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多