数据获取Ruby

时间:2018-03-07 10:13:18

标签: ruby-on-rails ruby

我正在运行以下API调用并获取vhosts列表并传递给另一个API并获取一些值,这些工作正常。

response = conn.get("/api/vhosts")
statistics = JSON.parse(response.body)

statistics.each do |vhosts|
  response1 = conn.get("/api/exchanges/#{vhosts["name"]}/direct_queue_exchange")
  statistics1 = JSON.parse(response1.body)
  statistics1.fetch("message_stats").fetch("publish_in_details").fetch("rate")    
end

示例输出:

output -1 - {"error"=>"Object Not Found", "reason"=>"Not Found"}

output -2 - {"message_stats"=>{"publish_in_details"=>{"rate"=>0.0}, "publish_in"=>91, "publish_out_details"=>{"rate"=>0.0}, "publish_out"=>91}, "outgoing"=>[], "incoming"=>[], "user_who_performed_action"=>"user_122f5b58", "arguments"=>{}, "internal"=>false, "auto_delete"=>false, "durable"=>true, "type"=>"direct", "vhost"=>"vhost_2388ce36", "name"=>"direct_queue_exchange"}
    {"outgoing"=>[], "incoming"=>[], "user_who_performed_action"=>"user_d6b8f477", "arguments"=>{}, "internal"=>false, "auto_delete"=>false, "durable"=>true, "type"=>"direct", "vhost"=>"vhost_37892b86", "name"=>"direct_queue_exchange"}

我遇到问题,想要获取我想要的值。例如,在我的代码中,我提取这些值,例如" rate"并且我收到此错误:key not found: "message_stats"因为某些输出中没有包含我正在查看的键

如何忽略此类{"error"=>"Object Not Found", "reason"=>"Not Found"}

之类的输出

3 个答案:

答案 0 :(得分:1)

如果密钥不存在,您可以使用#fetch中的默认选项返回空哈希值。

statistics1.fetch("message_stats", ()).fetch("publish_in_details", {}).fetch("rate", nil)

即使是简单的#dig方法

也是如此
statistics1.dig("message_stats", "publish_in_details", "rate")

如果缺少任何密钥,则会正常返回nil

答案 1 :(得分:1)

如果我的问题是正确的,那么可以通过以下几种方式实现这一目标:

在Ruby 2.3及以上版本中(感谢 @Steve Turczyn

statistics1.dig('message_stats', 'publish_in_details', 'rate')

与您的一样,fetch的第二个参数设置了默认值,如果找不到该键:

statistics1.fetch("message_stats", {}).fetch("publish_in_details", {}).fetch("rate", nil)

或者你可以这样做:

message_stats = statistics1['message_stats']
next unless message_stats

publish_in_details = message_stats['publish_in_details']
next unless publish_in_details

publish_in_details['rate']

答案 2 :(得分:0)

其他两个也为您的问题提供解决方案,下面是相同的描述。

fetch(key_name) # get the value if the key exists, raise a KeyError if it doesn't
fetch(key_name, default_value) # get the value if the key exists, return default_value otherwise

因此,使用以下内容可以解决您的问题。

statistics1.fetch("message_stats", ()).fetch("publish_in_details", {}).fetch("rate", nil)

您也可以检查是否存在错误,然后相应地处理案例。

if fetch("message_stats", false)
  statistics1.fetch("message_stats").fetch("publish_in_details").fetch("rate")
end