我有这个字符串,我想知道如何将其转换为哈希。
"{:account_id=>4444, :deposit_id=>3333}"
答案 0 :(得分:19)
miku的回答中建议的方式确实最简单,不安全。
# DO NOT RUN IT
eval '{:surprise => "#{system \"rm -rf / \"}"}'
# SERIOUSLY, DON'T
考虑使用哈希的不同字符串表示,例如JSON或YAML。它更安全,至少同样强大。
答案 1 :(得分:16)
稍加替换,您可以使用YAML:
require 'yaml'
p YAML.load(
"{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ')
)
但这只适用于这个特定的简单字符串。根据您的实际数据,您可能会遇到问题。
答案 2 :(得分:11)
如果你的字符串哈希是某种类似的(它可以是嵌套的或普通的哈希)
stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2}}"
你可以将它转换成这样的哈希,而不使用危险的eval
desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':'))
并且您发布的那个键是一个符号,您可以像这样使用
JSON.parse(string_hash.gsub(':','"').gsub('=>','":'))
答案 3 :(得分:10)
最简单且不安全只是评估字符串:
>> s = "{:account_id=>4444, :deposit_id=>3333}"
>> h = eval(s)
=> {:account_id=>4444, :deposit_id=>3333}
>> h.class
=> Hash
答案 4 :(得分:4)
猜猜我从来没有发布过我的解决方法......就在这里,
# strip the hash down
stringy_hash = "account_id=>4444, deposit_id=>3333"
# turn string into hash
Hash[stringy_hash.split(",").collect{|x| x.strip.split("=>")}]