我不是Ruby的专家,我尝试使用来自字符串的元素,该字符串是大型JSON消息的一部分。我无法出于任何原因使用JSON.parse,但能够找到一种循环对象的方法。但最后,我有这个剩余的字符串,我不知道如何获得价值:
{:time=>"2014-09-11 10:59:27 +0000", :cpu=>0.02421584874444766, :mem=>192069632, :disk=>635125760}
这附加到名为appUsage的变量。如果我尝试appUsage [" cpu"]我获得了:cpu。我已经尝试过互联网研究中的几个循环建议,但我不知道足够的Ruby - 我想 - 知道正确的一个可行。
P.S。:对于那些想知道这个"字符串"这是来自CFoundry图书馆app.stats的结果。
答案 0 :(得分:2)
这是一个红宝石Hash(不是一个字符串),包含它看起来像Date,Float和Fixnum对象
你正在接近尝试appUsage [" cpu"]但你的哈希中的键是symbols而不是字符串,它的意思是:cpu not" cpu"是的,红宝石哈希把每个都视为一个不同的关键。
app_usage = {:time=>"2014-09-11 10:59:27 +0000", :cpu=>0.02421584874444766, :mem=>192069632, :disk=>635125760}
app_usage[:cpu]
# > 0.02421584874444766
app_usage[:disk]
# > 635125760
要将字符串转换为哈希以使用它,如上所述,请使用eval()
。
在您的情况下,如果您有一个名为a
的字符串,您可以通过调用eval(a)
将您的字符串转换为哈希值,然后您可以使用您的哈希值:
a = "{:cpu=>0.02421584874444766, :mem=>192069632, :disk=>635125760}"
app_usage = eval(a)
app_usage[:cpu] # => 0.02421584874444766
但如this中所述:
它具有严重的安全隐患。它执行任何它是什么 通过,你必须110%肯定(因为,至少没有任何用户输入 一路上)它只包含正确形成的哈希或 来自外太空的意外错误/可怕的生物可能会开始 弹出。
答案 1 :(得分:0)
我从你那里得到的问题:
'{:time=>"2014-09-11 10:59:27 +0000", :cpu=>0.02421584874444766, :mem=>192069632, :disk=>635125760}'
是一个字符串。
这意味着:
appUsage = '{:time=>"2014-09-11 10:59:27 +0000", :cpu=>0.02421584874444766, :mem=>192069632, :disk=>635125760}'
因此我们必须将此String
对象转换为Hash
对象。
并且有一种肮脏的方式来做到这一点。 :P
appUsage = eval '{:time=>"2014-09-11 10:59:27 +0000", :cpu=>0.02421584874444766, :mem=>192069632, :disk=>635125760}'
有关详细信息,请查看this thread。