0

我正在尝试遍历 JSON 解析的哈希表(具有嵌套的哈希数组)并插入到 Text Table 中。我试图迭代的 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']

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

有什么想法吗?

4

3 回答 3

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 解释器,非常适合原型设计。它会打印出您键入的每个语句的结果,并具有自动完成功能以帮助您找到所需的类/方法。无需等待几个小时才能获得简单问题的 SO 答案,您将irb在几分钟内使用它。

于 2013-01-22T23:38:18.303 回答
0

也许你的意思只是

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

因为response['server']是散列而不是数组。

于 2013-01-22T23:21:00.093 回答
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']}"]
于 2013-01-22T23:34:43.893 回答