`[]':无法将String转换为Integer(TypeError)Ruby

时间:2013-01-22 23:14:52

标签: ruby hash

我正在尝试迭代一个JSON解析的哈希表(它具有嵌套的数组哈希)并插入到文本表中。我试图迭代的JSON解析代码是:

{"server"=>{"security_groups"=>[{"name"=>"default"}], "adminPass"=>"LhXEPMkYmqF7",   "id"=>"82b7e32b-f62b-4106-b499-e0046250229f", "links"=>[{"href"=>"http://10.30.1.49:8774/v2/89fc0b9d984d49fba5328766e923958f/servers/82b7e32b-f62b-4106-b499-e0046250229f", "rel"=>"self"}, {"href"=>"http://10.30.1.49:8774/89fc0b9d984d49fba5328766e923958f/servers/82b7e32b-f62b-4106-b499-e0046250229f", "rel"=>"bookmark"}], "OS-DCF:diskConfig"=>"MANUAL"}}

我用来迭代顶部的代码是:

server_table = Text::Table.new do | t |
      t.head = ['Server ID', 'Server URL', 'Admin Password']
   end
response = JSON.parse(r)

response['server'].each do | serv_info |
  server_table.rows << [["#{serv_info['id']}", "#{serv_info['links'][0]['href']}", "#{serv_info['adminPass']}"]]
end

puts server_table

我收到错误:

/lib/get_token.rb:166:in `[]': can't convert String into Integer (TypeError)
    from ./lib/get_token.rb:166:in `create_server'
    from ./lib/get_token.rb:165:in `each'
    from ./lib/get_token.rb:165:in `create_server'

如果我单独使用puts打印出每个命令,它们可以正常工作,但迭代却没有。获取正确信息的命令是:

puts response['server']['links'][0]['href']
puts response['server']['id']
puts response['server']['adminPass']

所有这3个工作,但如果我尝试迭代它们我得到字符串错误。我知道它与某些事情有关。每次返回一个哈希数组但我不完全理解为什么PUTS命令在脚本和IRB中都没有问题。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

每个serv_info是一对地图,表示为2个元素的数组。因此,代码中<<之后的所有内容都是错误的。

避免此类错误的秘诀是停止尝试模糊自己的代码。

server_table.rows应包含所有可能的服务器ID,链接和密码三元组。

response = # { "server" => ...}
server = response['server']
server_id = server['id']
link_infos = server['links']
admin_pass = server['adminPass']

link_infos.each do |link_info|
  link = link_info['href']
  server_table.rows << [server_id, link, admin_pass]
end

更新

我们可以轻松使用此代码处理多个服务器

response = # [ {"server" => ...}, ...]
response.each do |server|
   ... # above code snippet goes here 
       # or you may extract it into a method and call it here
end

另外我想提一下irb对于处理这类问题真的很棒。它是一个命令行Ruby解释器,它非常适合原型设计。它打印出您键入的每个语句的结果,并具有自动完成功能,以帮助您查找所需的类/方法。而不是等待几个小时来获得简单问题的答案,您将在几分钟内使用irb得到它。

答案 1 :(得分:0)

也许你的意思是

serv_info = response['server']
server_table.rows << [["#{serv_info['id']}", "#{serv_info['links'][0]['href']}",      "#{serv_info['adminPass']}"]]

由于response['server']是散列而不是数组。

答案 2 :(得分:0)

而不是使用:

server_table.rows << [["#{serv_info['id']}", "#{serv_info['links'][0]['href']}", "#{serv_info['adminPass']}"]]

尝试:

server_table.rows += [["#{serv_info['id']}", "#{serv_info['links'][0]['href']}", "#{serv_info['adminPass']}"]]

或者:

server_table.rows << ["#{serv_info['id']}", "#{serv_info['links'][0]['href']}", "#{serv_info['adminPass']}"]