我试图从json返回中将一个帐号列表插入一个数组中,我将json返回到一个哈希,但我不能因某种原因将值插入数组中。我检查了irb上的哈希位置,并获取了帐号,例如,位置my_hash["aws_accounts"][0]["owner_id"]
将获取第一个帐号,my_hash["aws_accounts"][0]["status"]["level"]
将获取第一个帐户的状态。
如果其各自的状态颜色为“黄色”,我基本上想要遍历所有帐户并存储帐号。
这是我的代码:
require 'json'
require 'rest-client'
j = RestClient.get 'https://chapi.cloudhealthtech.com/v1/aws_accounts?api_key=###&page=1&per_page=100'
my_hash = JSON.parse(j)
accnt_size = my_hash["aws_accounts"].size
intaccntsize = accnt_size.to_i
account_number_array = Array.new
x = 0
for accnt_iteration in x..intaccntsize do
puts accnt_iteration
if my_hash["aws_accounts"][accnt_iteration]["status"]["level"] == "yellow"
account_number_array.push(my_hash["aws_accounts"][accnt_iteration]["owner_id"])
end
end
这是错误信息
in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError)
from C:/Users/----/Desktop/-----/ruby_aws_sdk.rb:12:in `each'
from C:/Users/------/Desktop/-------/ruby_aws_sdk.rb:12:in `<main>'
任何建议都会有所帮助。感谢。
答案 0 :(得分:1)
问题的实际解决方案是使用3点范围而不是2点(3点是末尾独占,2点是包含端点),如下所示(这使用相同的my_hash
作为我的第二个代码块):
for x in 0..my_hash["aws_accounts"].size do
puts x
end
# 0
# 1
# 2
=> 0..2
my_hash["aws_accounts"][2]
=> nil
for x in 0...my_hash["aws_accounts"].size do
puts x
end
# 0
# 1
=> 0...2
my_hash["aws_accounts"][1]
=> {"owner_id"=>2, "status"=>{"level"=>"orange"}}
我没有获取帐号数量并尝试通过索引访问它们,而是自己迭代帐户。这是一个快速示例,我相信(根据您的描述)是my_hash
的相关部分和您的预期输出。
my_hash = {
"aws_accounts" => [
{ "owner_id" => 1, "status" => { "level" => "yellow" } },
{ "owner_id" => 2, "status" => { "level" => "orange" } }
]
}
account_number_array = []
my_hash["aws_accounts"].each do |account|
if account["status"]["level"] == "yellow"
account_number_array << account["owner_id"]
end
end
puts account_number_array.inspect
# => [1]