如何将表示哈希数组的Ruby String转换为可遍历的哈希数组?
解决Ruby风格哈希数组字符串转真实哈希数组的问题
嘿,这个问题我熟!你手里的这个字符串是Ruby风格的哈希数组的字符串表示,但它不是标准JSON格式,所以不能直接用常规的JSON解析方法。我给你两种可行的方案,按需选择:
方案1:使用eval(简单但注意安全)
如果这个字符串的来源是完全可信的(比如是你自己程序生成的,没有外部输入),可以直接用Ruby的eval方法解析,它会把字符串当作Ruby代码执行,直接得到哈希数组:
text_field = "[{\"shop_id\"=>110, \"budget\"=>\"040\"}, {\"shop_id\"=>111, \"budget\"=>173}, {\"shop_id\"=>141, \"budget\"=>344}, {\"shop_id\"=>142, \"budget\"=>\"020\"}, {\"shop_id\"=>144, \"budget\"=>\"220\"}]" # 解析成真实的哈希数组 text_field_array = eval(text_field) # 执行你需要的遍历操作 text_field_array.each do |hash| shop = Shop.find(hash[:shop_id]) # 注意:eval出来的哈希键是Ruby符号 # 把budget转成整数,避免字符串拼接错误 shop_budget = shop.budget + hash[:budget].to_i # 这里可以添加后续逻辑,比如更新店铺预算 shop.update(budget: shop_budget) end
⚠️ 重要提醒:eval会执行字符串里的任意Ruby代码,如果字符串来自不可信来源(比如用户输入),会有严重的代码注入风险,这种情况绝对不要用这个方案!
方案2:转换为JSON格式后解析(更安全)
如果字符串来源不可信,推荐先把它转换成标准JSON格式,再用JSON.parse解析,这样更安全:
require 'json' text_field = "[{\"shop_id\"=>110, \"budget\"=>\"040\"}, {\"shop_id\"=>111, \"budget\"=>173}, {\"shop_id\"=>141, \"budget\"=>344}, {\"shop_id\"=>142, \"budget\"=>\"020\"}, {\"shop_id\"=>144, \"budget\"=>\"220\"}]" # 将Ruby风格的"=> "替换为JSON的": ",转换成兼容JSON的字符串 json_compatible_string = text_field.gsub('=>', ':') # 解析成哈希数组,此时哈希键是字符串 text_field_array = JSON.parse(json_compatible_string) # 执行遍历操作 text_field_array.each do |hash| shop = Shop.find(hash['shop_id']) # 注意:JSON.parse出来的哈希键是字符串 shop_budget = shop.budget + hash['budget'].to_i # 统一转成整数计算 # 后续逻辑 shop.update(budget: shop_budget) end
关键注意点
- 无论用哪种方案,都要把
budget的值转成整数(.to_i),因为原字符串里有的budget是带前导零的字符串(比如"040"),直接和数值相加会变成字符串拼接,导致计算错误。 - 两种方案得到的哈希键类型不同:
eval得到的是符号(:shop_id),JSON.parse得到的是字符串('shop_id'),遍历的时候要注意对应。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

