2014-09-11 47 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了。