首页 > 解决方案 > Ruby - 将 JSON 对象和键传递给函数

问题描述

我只是想创建一个辅助函数,它会尝试从“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')

我尝试了各种方法:

没有将字符串隐式转换为整数:

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)

标签: jsonruby

解决方案


如果我理解正确,对于这种情况,完美的选择是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


推荐阅读