如何将传入方法的字符串参数作为Hash取值路径使用
问题修正与解决方案
你原代码里有两处笔误需要先修复:
File.read(file)中的file未定义,应该用方法入参file_to_load- 原逻辑里的
sections变量也没有定义,属于无效代码
以下是两种可行的取值实现方案:
方案1:安全解析(推荐,无注入风险)
利用Ruby内置的Hash#dig方法,先把字符串路径解析为key序列再取值,完全不需要执行动态代码,适配符号key、数组数字索引等常规场景:
require 'json' def do_the_thing(file_to_load, hash_path) file = File.read(file_to_load) data = JSON.parse(file, symbolize_names: true) # 把路径字符串拆解为dig方法可接收的key数组 keys = hash_path.scan(/\[(:?[\w]+)\]/).map do |match| key = match.first if key.start_with?(':') key[1..-1].to_sym elsif key.match?(/^\d+$/) key.to_i else key.to_s end end # 安全取值,中间层级不存在时返回nil不会抛异常 data.dig(*keys) end # 调用示例 result = do_the_thing(file_I_want, '[:foo][:bar][0]')
方案2:简易实现(仅内部可控场景使用)
如果你的使用场景完全可控,不存在恶意输入的可能,可以用instance_eval快速实现,但对外暴露的接口绝对禁止使用,存在代码注入风险:
require 'json' def do_the_thing(file_to_load, hash_path) file = File.read(file_to_load) data = JSON.parse(file, symbolize_names: true) instance_eval("data#{hash_path}") end
内容的提问来源于stack exchange,提问作者Sam O'Donnell
相关产品推荐
相关产品推荐

