【问题标题】:How to parse a string representation of a hash如何解析哈希的字符串表示
【发布时间】:2012-01-26 16:34:45
【问题描述】:

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

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

【问题讨论】:

标签: ruby hash


【解决方案1】:

miku 的回答中建议的方式确实是最简单且不安全

# DO NOT RUN IT
eval '{:surprise => "#{system \"rm -rf / \"}"}'
# SERIOUSLY, DON'T

考虑使用不同的字符串表示形式的哈希值,例如JSON 或 YAML。它更安全,至少同样健壮。

【讨论】:

  • nop 这些是 rails post 参数所以我想我不能使用 json 或 yaml
  • 有趣。 Rails 中的控制器通常接收 POST 参数作为 Ruby 对象。你怎么把它们当作一个字符串?
  • 希望没有人运行它来“看看它会做什么”:-/
  • 运行它需要很长时间
  • 是的,至少可以解释一下您编写的代码的作用。我觉得可能有人刚接触 ruby​​/coding 可能会运行它只是为了看看。所以对于那个人:它会删除你所有的文件。
【解决方案2】:

稍作替换,您就可以使用 YAML:

require 'yaml'

p YAML.load(
  "{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ')
  )

但这仅适用于这个特定的简单字符串。根据您的真实数据,您可能会遇到问题。

【讨论】:

  • 工作就像一个魅力!我将我的传递给HashWithIndifferentAccess.new 以获得类似于参数哈希的哈希。
  • 这仅适用于 YAML 原生的数据类型。例如,正则表达式不能以这种方式解析。
【解决方案3】:

最简单且最不安全的是只评估字符串:

>> s = "{:account_id=>4444, :deposit_id=>3333}"
>> h = eval(s)
=> {:account_id=>4444, :deposit_id=>3333}
>> h.class
=> Hash

【讨论】:

  • 我在 rails post params 得到这些。除了eval,没有安全的方法将字符串转换为哈希。
  • 我不知道你的设置,但也许首先取回哈希会更容易。否则,ruby 支持一些 TAINT 级别,请参阅:ruby-doc.org/docs/ProgrammingRuby/html/taint.html
【解决方案4】:

如果你的字符串哈希是这样的(它可以是嵌套或普通哈希)

stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2, 'key3' => nil}}"

你可以将它转换成这样的哈希值,而不需要使用危险的 eval

desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':').gsub('nil','null'))

对于您发布的关键是您可以像这样使用的符号的那个

JSON.parse(string_hash.gsub(':','"').gsub('=>','":'))

【讨论】:

  • Hashes contains 'null' for null objects,而 this 包含 'nil',所以也需要替换。
【解决方案5】:

我猜我从来没有为此发布过我的解决方法……就这样吧,

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

【讨论】:

  • 如果您有任何包含,=> 的数据,这将无法正确拆分字段。 { :text => "Welcome, friends.", delim => "=>" }
猜你喜欢
  • 2012-02-22
  • 2019-04-04
  • 2013-02-04
  • 2014-07-10
  • 2014-07-24
  • 2017-02-19
  • 1970-01-01
  • 2013-12-19
  • 2019-07-29
相关资源
最近更新 更多