我有这个字符串,我想知道如何将其转换为哈希.
"{:account_id=>4444, :deposit_id=>3333}"
Run Code Online (Sandbox Code Playgroud)
Jan*_*Jan 19
在miku的答案中建议的方式确实最容易和最不安全.
# DO NOT RUN IT
eval '{:surprise => "#{system \"rm -rf / \"}"}'
# SERIOUSLY, DON'T
Run Code Online (Sandbox Code Playgroud)
考虑使用哈希的不同字符串表示形式,例如JSON或YAML.它更安全,至少同样强大.
knu*_*nut 16
只需更换一下,您就可以使用YAML:
require 'yaml'
p YAML.load(
"{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ')
)
Run Code Online (Sandbox Code Playgroud)
但这只适用于这个特定的简单字符串.根据您的实际数据,您可能会遇到问题.
Mr.*_*ess 11
如果您的字符串哈希是某种类似的东西(它可以是嵌套或普通哈希)
stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2}}"
Run Code Online (Sandbox Code Playgroud)
你可以将它转换成这样的哈希,而不使用危险的eval
desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':'))
Run Code Online (Sandbox Code Playgroud)
而对于你发布的那个键是一个符号,你可以像这样使用
JSON.parse(string_hash.gsub(':','"').gsub('=>','":'))
Run Code Online (Sandbox Code Playgroud)
mik*_*iku 10
最简单和最不安全的只是评估字符串:
>> s = "{:account_id=>4444, :deposit_id=>3333}"
>> h = eval(s)
=> {:account_id=>4444, :deposit_id=>3333}
>> h.class
=> Hash
Run Code Online (Sandbox Code Playgroud)
我想我从来没有发布过这个问题的解决方法......就这样,
# 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("=>")}]
Run Code Online (Sandbox Code Playgroud)