如何解析哈希的字符串表示

时间:2011-12-23 08:57:05

标签: ruby hash

我有这个字符串,我想知道如何将其转换为哈希。

"{:account_id=>4444, :deposit_id=>3333}"

5 个答案:

答案 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("=>")}]