0

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つはすべて機能しますが、それらを繰り返し処理しようとすると、文字列エラーが発生します。.eachがハッシュの配列を返すことと関係があることは知っていますが、スクリプトとIRBでPUTSコマンドが問題なく機能している理由を完全には理解していません。

何かご意見は?

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

使用する代わりに:

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 に答える
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 に答える