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

时间:2019-06-10 20:47:45

标签: json ruby scripting

在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)

2 个答案:

答案 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