json - 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)
解决方案
如果我理解正确,对于这种情况,完美的选择是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
推荐阅读
- java - Maven POM 从 TestNG XML 执行旧的测试用例类
- symfony - 奏鸣曲媒体上下文被忽略
- c++ - multi 从结构和模板结构继承结构,访问基本非模板结构数据时的顺序很重要
- javascript - 渲染中的反应状态在返回中不可用
- php - 如果数组包含来自另一个数组的字符串,则删除
- ios - 图像未显示在 BarButtonItem 中
- python - 如何匹配整个回溯消息而不是使用正则表达式提前停止
- javascript - 如何将 JavaScript 放入 MySQL 区域?
- windows - 使用 WMI 命令的 lastlogon 时间戳之间的时区差异
- java - 如何使用 StringTokenizer 类