2014-09-11 5 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 .: Для тех, кто хотел бы знать, откуда эта «строка», это результат того, что происходит из приложения app.stats из библиотеки CFoundry.

+0

так что вы имеете в виду 'appUsage = '{: time =>" 2014-09-11 10:59:27 +0000 ",: cpu => 0.02421584874444766,: mem => 192069632,: disk => 635125760}'' это строка, которую вы получаете? – rony36

ответ

2

Это рубин Hash (не String), содержащий то, что кажется, как дата, Float и объекты Fixnum

Вы были близки пытаются appUsage [ «центральный процессор»], но ключи в хэш symbols вместо строки , поддерживая его: cpu не «cpu» и да ruby ​​Хэш обрабатывает каждый как другой ключ.

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% уверены (как в, по крайней мере, ни один пользователь не вводит нигде по пути) он будет содержать только правильно сформированные хэши или могут начаться неожиданные ошибки/ужасные существа из космоса popping вверх.

+1

Благодарим вас за отличное объяснение. Поэтому вы заставили меня изучить «хэш-аспект» Ruby! ;-) – FYB

+0

@FYB рад помочь – Nimir

+1

приятное объяснение приятель :) @Nimir – rony36

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.