如何从红宝石sinatra的json中获取每个值?

时间:2014-03-11 14:08:41

标签: ruby json sinatra

我需要提取json的每个键值,并且该值应保存在数据库中。但是我在获取json中每个键的值时遇到了麻烦。

JSON

{
"topo": [
    {
        "dpid": "00:00:00:00:00:00:00:03",
        "ports": [
            3,
            1
        ]
    }
],
"app": "vm_migration"
}

post '/save_summary', :provides => :json do
begin
    params = JSON.parse(request.env["rack.input"].read)
    return params["topo"][0]["dpid"] 
            #above code return correct value
            return params["topo"][0]["ports"] #this is not working 
rescue Exception => e
    return e.message
end
end 

我不知道ports语句有什么问题,请帮我弄清楚小问题。

1 个答案:

答案 0 :(得分:3)

您要归还的内容 - params["topo"][0]["ports"] - 是一个包含两个元素的数组,它是things you can return from a Sinatra route之一:

  
      
  • 包含两个元素的数组:[status (Fixnum), response body (responds to #each)]
  •   

因此,您尝试返回状态为3且正文为1的回复。响应主体需要是响应each的对象,1不响应。如果您检查日志或控制台,则可能会看到错误undefined method `each' for 1:Fixnum。假设您只想在浏览器中查看数组,只需将其转换为字符串:

return params["topo"][0]["ports"].to_s

第一个示例有效,因为params["topo"][0]["dpid"]是一个字符串,您可以从路径返回字符串。