首页 > 解决方案 > 在ruby中将字符串转换为哈希

问题描述

我有一个这样的字符串"{ssl:true,sslAllowInvalidCertificates:true}"

(请注意,字符串可以包含任意数量的键/值对)

我想在 Ruby 中将其转换为哈希,如下所示:

{ssl:true,sslAllowInvalidCertificates:true}

(请注意,输出与上面的完全相似。它不应该是“通用”哈希表示法,如

{"ssl" => "true","sslAllowInvalidCertificates" => "true"}

MongoDB 客户端库只有在与要求完全相同时才能识别该选项,否则会引发错误。

如何在红宝石中做到这一点?

蒂亚!

标签: ruby

解决方案


TL;博士

要将您的 String 转换为 Hash,您要么必须自己解析它,要么对其调用Kernel#eval。无论哪种方式,您的真正问题似乎是将其返回到您预期格式的字符串。一种方法是重新打开 Hash 类并添加自定义输出方法,而不是依赖别名为Hash#inspect的 Hash#to_s 方法。

字符串到哈希

如果您信任数据源并且有某种机制来清理或检查字符串是否可能执行任意代码,那么#eval 无疑是​​您可以做的最简单的事情。不过,我个人会通过确保 String 没有首先受到污染来增加一点安全性。例如:

str = "{ssl:true,sslAllowInvalidCertificates:true}"

raise "string tainted: #{str}" if str.tainted?
hsh = eval str
#=> {:ssl=>true, :sslAllowInvalidCertificates=>true}

但是,如果您不信任字符串的来源或结构,您可以使用以下的一些变体作为起点,自行解析和验证信息:

hsh = Hash[str.scan(/\w+/).each_slice(2).to_a]
#=> {:ssl=>true, :sslAllowInvalidCertificates=>true}

哈希到自定义字符串

如果您想将其作为字符串转储回您的自定义格式,您可以对 Hash 类进行猴子补丁或将单例方法添加到给定的 Hash 实例以提供 #to_mongo 方法。例如:

class Hash
  def to_mongo
    str = self.map { |k, v| '%s:%s' % [k, v] }.join ?,
    '{%s}' % str
  end
end

在您的 Hash 实例上调用此方法将产生您似乎想要的结果:

hsh.to_mongo
#=> "{ssl:true,sslAllowInvalidCertificates:true}"

推荐阅读