Ruby - передать JSON объект и ключи для работы - PullRequest
0 голосов
/ 25 мая 2020

Я просто пытаюсь создать вспомогательную функцию, которая попытается получить значение из «ohai_data» и вернуть значение по умолчанию, если оно не найдено.

«ohai_data»:

ohai_data = JSON.parse(::IO.read(json_file).force_encoding(Encoding::UTF_16))

Данные в следующем формате:

{
    "kernel": {
        "os_info": {
            "cs_name": "<the computer name>"
        }
    }
}

например,

Это работает:

ohai_data['kernel']['os_info']['cs_name']

Это не:

def get_val(val_to_get, ohai_data, default_val)    
    val = ohai_data[val_to_get]
    val = val.to_s
    if val.nil? or val.empty?
        puts "#{val_to_get} not found within ohai_data.  Using default value: #{default_val}"
        val = default_val
    end
    puts "Getting #{val_to_get} from ohai_data:  #{val}"
    return val.chomp
end

machine_name = get_val("['kernel']['os_info']['cs_name']", ohai_data, 'n/a')

Я пробовал разные вещи:

неявное преобразование String в Integer:

machine_name = get_val(['kernel']['os_info']['cs_name'], ohai_data, 'n/a')

Никогда ничего не находит 1, вероятно, потому что ['kernel'] ['os_info' ] ['cs_name']! = "['kernel'] ['os_info'] ['cs_name']":

machine_name = get_val("['kernel']['os_info']['cs_name']", ohai_data, 'n/a')

Никогда ничего не находит 2, используя ohai_data.fetch (val_to_get) Никогда ничего не находит 3, используя ohai_data.fetch_values ​​(val_to_get)

1 Ответ

0 голосов
/ 25 мая 2020

Если я вас правильно понял, для этого случая идеальным выбором будет dig метод:

ohai_data = JSON.parse(::IO.read(json_file).force_encoding(Encoding::UTF_16))
default_value = 'n/a'

> ohai_data.dig('kernel','os_info','cs_name') || default_value
=> "<the computer name>"

ohai_data.dig('kernel','os_info','cs_other_name') || default_value
=> "n/a"

https://ruby-doc.org/core-2.3.0_preview1/Hash.html#method -i-dig

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