Ruby on Rails:通过嵌套 API JSON 响应的最佳方式

Ruby on Rails: Best way to go trough a nested API JSON Response

提问人:Jens Schmidt 提问时间:8/15/2022 更新时间:8/15/2022 访问量:43

问:

我正在尝试从更大/嵌套的 API JSON 响应中获取特定数据。但是因为它是高度动态的,所以它经常失败,因为 JSON 树中缺少一些分支。

有没有好的方法或一些最佳实践来获取数据?

例:

@myrecords.cvss31 = jsonresponse["result"]["CVE_Items"][0]["impact"]["baseMetricV3"]["cvssV3"]["vectorString"]

在这种情况下,有时会引发错误,因为“cvssV3”为零。也许将来“baseMetricV3”也可能为零。

因此,我的方法是为每个属性创建 7 个 if 语句。“if jsonresponse[”result“].present?...”, next: “if jsonresponse[”result“][”CVE_Items“].present?” 等等。但这似乎不对。

我也尝试过类似“..[“vectorString”].presence ||= “没有 NVD CVSS 3.1 分数”“,但由于缺少”vectorString“之前的属性,这似乎也不起作用。

我还有很多其他属性要从该 API 中提取。所以基本上我必须写成百上千个条件语句。

如果我不想从该 JSON 响应中提取所有数据,是否有更好的方法?

json 嵌套 ruby-on-rails-7

评论

3赞 Eyeslandic 8/15/2022
rubydoc.info/stdlib/core/Hash:dig 可以帮到你
0赞 Jens Schmidt 8/15/2022
谢谢你,这就像一个魅力......jsonresponse.dig("result", "CVE_Items", 0, "impact", "baseMetricV3", "cvssV3", "vectorString").presence || "no NVD CVSS 3.1 Score"
0赞 Eyeslandic 8/15/2022
这回答了你的问题吗?如何使用 Ruby 2.3 中引入的 Array#dig 和 Hash#dig?

答:

1赞 Saqib Shahzad 8/15/2022 #1

把它放在这里给任何在这个问题上绊倒的人。通过使用 dig:

jsonresponse.dig("result", "CVE_Items", 0, "impact", "baseMetricV3", "cvssV3", "vectorString").presence || "no NVD CVSS 3.1 Score"