我正在尝试迭代一个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中都没有问题。
有什么想法吗?
答案 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']}"]