Разобрать файл JSON в скрипте ruby ​​и сохранить конкретное значение - PullRequest
0 голосов
/ 10 июня 2019

Разобрать файл JSON в скрипте Ruby и получить значение для "ключа"

Мой файл 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

Сообщение об ошибке: неявное преобразование строки в целое число (TypeError)

Ответы [ 2 ]

1 голос
/ 11 июня 2019

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
1 голос
/ 11 июня 2019

Из-за структуры conf.json, где он имеет композицию {} с [], доступ к каждому ключу по его имени затруднен.Поэтому используйте mykey = data['terraform'][0]['backend'][0]['s3'][0]['key']

Здесь terraform - это отдельный объект в {}, доступ к которому можно получить по его имени.Он содержит объект массива [], к которому должен обращаться индекс [0], поскольку существует только один элемент.То же самое относится и к внутренним элементам.'{}' используется для пары ключ-значение Object, а '[]' используется для массивов со значениями в json.

и заключает всю "terraform" в {} в conf.json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...