首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据获取Ruby

数据获取Ruby
EN

Stack Overflow用户
提问于 2018-03-07 10:13:17
回答 3查看 482关注 0票数 1

我正在运行下面的API调用,并将列表传递给vhost,然后传递到另一个API,并获得一些值,这些都很好。

代码语言:javascript
复制
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

样本输出:

代码语言:javascript
复制
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"}

我在获取我想要的值时遇到了问题。例如,在我的代码中,我获取这些值,比如“速率”,我得到了这个错误:key not found: "message_stats",因为有些输出不包含我正在查找的键

我怎么能忽略像这样的{"error"=>"Object Not Found", "reason"=>"Not Found"}输出

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-07 10:27:55

如果我没弄错你的问题,有几种方法可以做到:

在Ruby2.3及以上版本(感谢@Steve )

代码语言:javascript
复制
statistics1.dig('message_stats', 'publish_in_details', 'rate')

与您的类似,如果找不到键,fetch的第二个参数将设置默认值:

代码语言:javascript
复制
statistics1.fetch("message_stats", {}).fetch("publish_in_details", {}).fetch("rate", nil)

或者你可以这样做:

代码语言:javascript
复制
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']
票数 1
EN

Stack Overflow用户

发布于 2018-03-07 10:27:39

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

代码语言:javascript
复制
statistics1.fetch("message_stats", ()).fetch("publish_in_details", {}).fetch("rate", nil)

即使simper也是#dig方法。

代码语言:javascript
复制
statistics1.dig("message_stats", "publish_in_details", "rate")

如果缺少任何键,nil将优雅地返回。

票数 1
EN

Stack Overflow用户

发布于 2018-03-07 10:33:13

另外两个也为您的问题提供了解决方案,下面是对相同问题的描述。

代码语言:javascript
复制
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

因此,使用下面将解决您的问题。

代码语言:javascript
复制
statistics1.fetch("message_stats", ()).fetch("publish_in_details", {}).fetch("rate", nil)

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

代码语言:javascript
复制
if fetch("message_stats", false)
  statistics1.fetch("message_stats").fetch("publish_in_details").fetch("rate")
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49149289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档