在ruby脚本中解析JSON文件并存储特定值

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

在Ruby脚本中解析JSON文件并获取“key”的值

我的JSON文件

"terraform": [
    {
  "backend": [
    {
      "s3": [
        {
          "bucket": "terraform-dev",
          "dynamodb": "terraform_files",
          "encrypt": "true",
          "key": "Apple/Employee/Background/terraform.tfstate"
        }
      ]
     }
  ],
  "required_version": "~> 0.11.8"
}
] 

我尝试用Ruby编写这个脚本

#!/usr/bin/env ruby
require "json"
file = File.open "/Users/Test/conf.json"
data = JSON.load file
mykey= data['terraform'].first['backend']['s3']['key']
print mykey
file.close

预期结果:Apple / Employee / Background / terraform.tfstate

错误消息:没有将String隐式转换为Integer(TypeError)

提问于
用户回答回答于

由于conf.json的结构,其组成为{}和[],因此很难按名称访问每个键。所以使用 mykey = data['terraform'][0]['backend'][0]['s3'][0]['key']

这里,terraform是{}中的单个对象,可以通过其名称访问。它包含一个数组对象,它必须由索引[0]访问,因为只有一个元素。内部元素也是如此。'{}'用于键值对Object,'[]'用于值为json的数组。

并将{}中的整个“terraform”括在conf.json中。

用户回答回答于

Hash#dig适用于根据索引访问数组:

p hash.dig(:terraform, 0, :backend, 0, :s3, 0, :key)
# "Apple/Employee/Background/terraform.tfstate"

如果某个中间步骤为零,则加上它返回nil:

p foo.dig(:terraform, 0, :backend, 0, :s3, 1, :key) # nil
p foo.dig(:terraform, 0, :backend, 0, :orale, 0, :key) # nil

扫码关注云+社区

领取腾讯云代金券