如何将字符串形式的嵌套哈希(nested hash)转换回哈希(hash)?
嘿,这个问题我太熟了!在Ruby里要把这种Ruby哈希格式的字符串转成真正的哈希对象,有几种实用的办法,我给你掰扯清楚:
方法一:用
eval快速解决(但要注意安全风险) 你的字符串本身就是合法的Ruby哈希语法,直接用eval就能把它转成真实的哈希:
# 先读取文件内容得到字符串 hash_string = File.read('your_file.txt') # 解析成哈希 parsed_hash = eval(hash_string) # 验证一下类型,会输出 Hash puts parsed_hash.class
⚠️ 敲黑板!安全提醒:这种方法只适用于你100%信任文件内容的场景!如果文件里被人偷偷塞了恶意Ruby代码,eval会直接执行,那麻烦可就大了。
方法二:更安全的长期方案(推荐)
如果可以重新存储你的哈希,强烈建议用JSON格式来序列化和读取,这样既安全还能跨语言通用:
第一步:存储哈希时转成JSON格式
original_hash = {"SONGS"=>{1=>["2018-05-29 18:19:14 +0530", "HAPPY", "Meri Sapnon Ki Rani"]}} # 把哈希转成JSON字符串写入文件 File.write('songs.json', original_hash.to_json)
第二步:读取时解析JSON
# 先引入JSON库(Ruby默认自带) require 'json' # 读取文件内容 json_string = File.read('songs.json') # 解析成哈希 parsed_hash = JSON.parse(json_string) # 小细节:JSON解析会把整数键转成字符串,要是需要还原成整数可以这么处理 parsed_hash["SONGS"] = parsed_hash["SONGS"].transform_keys(&:to_i) # 现在parsed_hash就是你要的哈希对象啦
折中方案:没法重新存储?试试正则转JSON再解析
如果没办法重新生成文件,又担心eval的安全问题,可以尝试把Ruby哈希格式转成JSON格式再解析,不过这种方法有局限性(比如哈希里的字符串包含=>就会出错):
require 'json' hash_string = File.read('your_file.txt') # 把Ruby的=>替换成JSON的:,处理数字和字符串键 json_string = hash_string.gsub(/(\w+|\d+)=>/) { |m| "#{m.chomp('=>')}:" } # 解析成哈希 parsed_hash = JSON.parse(json_string) # 同样处理整数键的问题 parsed_hash["SONGS"] = parsed_hash["SONGS"].transform_keys(&:to_i)
总的来说,能重新存储的话优先用JSON方案,安全又靠谱;实在不行,在完全信任文件内容的情况下用eval最省心。
内容的提问来源于stack exchange,提问作者Salman Shaik
相关产品推荐
相关产品推荐

