2014-09-11 45 views
1

我不是Ruby的专家,我尝试使用来自作为大JSON消息一部分的字符串中的元素。我从来没有能够使用JSON.parse出于任何原因,但能够找到一种方法来遍历对象。但到了最后,我有这个剩余的字符串,我不知道如何得到的值:如何阅读和使用ruby json字符串

{: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

所以你的意思是'appUsage ='{:time =>“2014-09-11 10:59:27 +0000”,:cpu => 0.02421584874444766,:mem => 192069632,:disk => 635125760}这是一个你得到的字符串? – rony36 2014-09-11 11:35:12

回答

2

这是一个包含什么,似乎像一个日期,浮球Fixnum对象对象

你被关闭试图appUsage [“CPU”]但在你的哈希键是symbols,而不是串红宝石Hash(不是一个字符串) ,它的meaining:cpu不是“cpu”,是的ruby Hash把每个都视为不同的关键。

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

谢谢你的伟大的解释。所以你让我学习Ruby的“哈希”方面! ;-) – FYB 2014-09-11 12:58:32

+0

@FYB很高兴帮忙 – Nimir 2014-09-11 13:11:17

+1

不错的解释哥们:) @Nimir – rony36 2014-09-11 18:14:25

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了。