在Ruby脚本中解析JSON文件并获取“键”的值
我的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)
答案 0 :(得分:1)
由于conf.json的结构由{}和[]组成,因此很难按名称访问每个键。所以用
mykey = data['terraform'][0]['backend'][0]['s3'][0]['key']
在这里,terraform是{}中的单个对象,可以通过其名称进行访问。它包含一个数组对象[],由于只有一个元素,因此必须由索引[0]访问。内部元素也一样。 '{}'用于键值对Object,'[]'用于具有json值的数组。
并将整个“ terraform”括在conf.json中的{}中。
答案 1 :(得分:1)
Hash#dig用于访问基于其索引的数组:
p hash.dig(:terraform, 0, :backend, 0, :s3, 0, :key)
# "Apple/Employee/Background/terraform.tfstate"
加号是,如果某个中间步骤为nil,则返回nil:
p foo.dig(:terraform, 0, :backend, 0, :s3, 1, :key) # nil
p foo.dig(:terraform, 0, :backend, 0, :orale, 0, :key) # nil