如何在Ruby中通过点分隔字符串从JSON中取值?
在Ruby中通过点分隔字符串从JSON取值的通用方法
假设我们有test.json文件内容如下:
{ "this": { "is": { "string": "value" } } }
如果要获取this.is.string对应的值,常规写法是硬编码层级访问:
# 读取JSON文件 json_file = File.open("test.json") data_from_file = JSON.load(json_file) # 硬编码层级取值 get_value = data_from_file["this"]["is"]["string"]
但这种写法仅适用于固定层级的路径,当遇到this.is.yet.another.string这类动态或多层级的点分隔路径时,就需要一个通用的实现方式。
通用解决方案
以下方法支持任意层级的点分隔路径,同时兼容数组下标(路径中的数字会自动转为整数):
def get_value(data, query) query.split('.').inject(data) do |current_val, key| key = key.to_i if current_val.is_a?(Array) current_val.fetch(key) end end # 调用示例 get_value(data_from_file, 'this.is.string') # => "value"
代码解析
query.split('.'):将点分隔的路径拆分为键数组,例如'this.is.string'会被拆分为['this', 'is', 'string']inject(data):以原始JSON数据为初始值,遍历每个键,逐层深入访问数据结构key.to_i if current_val.is_a?(Array):若当前节点是数组,自动将字符串形式的下标转为整数(比如路径'items.2.title'中的2会被转为数组下标)fetch(key):相比直接使用[]访问,fetch在找不到对应键/下标时会抛出KeyError,便于排查问题;也可以传入默认值避免异常,例如current_val.fetch(key, nil)
内容的提问来源于stack exchange,提问作者RaHan
相关产品推荐
相关产品推荐

