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

zor*_*ras 14 ruby hash

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

"{: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.它更安全,至少同样强大.

  • 当我运行它时,这需要很长时间 (14认同)
  • 让我们希望没有人能够"看看它会做什么": - / (4认同)
  • 是的,至少可以解释一下你写的代码是做什么的.我觉得有可能是一个新的ruby /编码可能会运行它无论如何只是为了看.所以对于那个人:它会删除你的所有文件. (2认同)

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)


zor*_*ras 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("=>")}]
Run Code Online (Sandbox Code Playgroud)

  • 如果您有任何包含“,”或“=>”的数据,这将无法正确分割字段。`{ :text => "欢迎,朋友们。", delim => "=>" }` (6认同)