ruby - 在ruby中将字符串转换为哈希
问题描述
我有一个这样的字符串"{ssl:true,sslAllowInvalidCertificates:true}"
(请注意,字符串可以包含任意数量的键/值对)
我想在 Ruby 中将其转换为哈希,如下所示:
{ssl:true,sslAllowInvalidCertificates:true}
(请注意,输出与上面的完全相似。它不应该是“通用”哈希表示法,如
{"ssl" => "true","sslAllowInvalidCertificates" => "true"}
MongoDB 客户端库只有在与要求完全相同时才能识别该选项,否则会引发错误。
如何在红宝石中做到这一点?
蒂亚!
解决方案
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}"
推荐阅读
- git - 无法通过命令行将我的 Web 应用程序推送到 GitHub 存储库
- time-complexity - 不同参数顺序操作的时间复杂度
- apache-spark - Hadoop:火花作业无法处理小数据集
- kubernetes - 是否有一种安全的方法可以在同一个 Kubernetes pod 中的另一个容器中触发命令?
- java - ReentrantLock Condition signallAll() 是如何工作的?
- perl - PDL/perldl mac 奇怪的权限/恶意软件错误
- python - 为什么“#!/usr/bin/env PATH=... python”会挂起,在调用 python 时如何指定 PATH?
- cassandra - 当数据写入 Cassandra 中的副本时会发生什么情况,但由于缺少仲裁,协调器会向客户端返回超时异常?
- c# - 我无法将字符串转换为 int
- html - 如何在同一个div中将文本分成两个单独的部分