如何将表单提交的哈希数组格式字符串转换为实际哈希数组?
把Ruby风格哈希数组字符串转为真实哈希数组的方法
遇到这种Ruby语法格式的字符串,直接拆分大括号确实会破坏结构,这里提供两种可行的处理方式:
方法一:直接用eval快速转换
如果这个字符串的来源是可信的(比如内部生成,而非用户输入),可以直接用Ruby的eval方法解析,它能直接识别Ruby语法的字符串:
str = "[{:id=>4, :total=>0.415e2}, {:id=>6, :total=>0.2325e2}, {:id=>5, :total=>0.304e2}]" hash_array = eval(str) # 执行后hash_array就是目标哈希数组: # [{:id=>4, :total=>41.5}, {:id=>6, :total=>23.25}, {:id=>5, :total=>30.4}]
注意:eval会执行字符串中的任意Ruby代码,如果字符串来自不可信来源(比如外部用户提交的内容),绝对不能用这个方法,会有严重的安全风险。
方法二:正则解析(安全版)
如果字符串来源不可信,用正则提取键值对的方式更安全,步骤如下:
str = "[{:id=>4, :total=>0.415e2}, {:id=>6, :total=>0.2325e2}, {:id=>5, :total=>0.304e2}]" # 先去掉首尾的方括号,拿到哈希块的集合字符串 inner_content = str[1..-2] # 拆分每个独立的哈希块,补全大括号 hash_blocks = inner_content.split(/},\s*{/).map do |block| "{#{block.gsub(/^\{|\}$/, '')}}" end # 逐个解析哈希块为真实哈希 hash_array = hash_blocks.map do |block_str| # 匹配所有:key=>value格式的键值对 key_value_pairs = block_str.scan(/:(\w+)=>([\d.e-]+)/) # 转成哈希,键转成符号,值转成浮点数 key_value_pairs.to_h.transform_keys(&:to_sym).transform_values { |val| Float(val) } end
这种方法只提取预定义格式的键值对,不会执行任意代码,完全规避了安全风险,同时也能正确处理科学计数法的数值转换。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

