Как разобрать строковое представление хеша

У меня есть эта строка, и мне интересно, как ее преобразовать в хэш.

"{:account_id=>4444, :deposit_id=>3333}"

Ответ 1

Угадай, я никогда не писал об этом обходной путь... Вот оно,

# strip the hash down
stringy_hash = "account_id=>4444, deposit_id=>3333"

# turn string into hash
Hash[stringy_hash.split(",").collect{|x| x.strip.split("=>")}]

Ответ 2

Способ, предложенный в ответе miku, действительно проще всего и unsafest.

# DO NOT RUN IT
eval '{:surprise => "#{system \"rm -rf / \"}"}'
# SERIOUSLY, DON'T

Рассмотрим использование другого строкового представления ваших хешей, например. JSON или YAML. Это более безопасно и по крайней мере одинаково устойчиво.

Ответ 3

С небольшой заменой вы можете использовать YAML:

require 'yaml'

p YAML.load(
  "{:account_id=>4444, :deposit_id=>3333}".gsub(/=>/, ': ')
  )

Но это работает только для этой конкретной простой строки. В зависимости от ваших реальных данных могут возникнуть проблемы.

Ответ 4

Самый простой и unsafest - это просто оценить строку:

>> s = "{:account_id=>4444, :deposit_id=>3333}"
>> h = eval(s)
=> {:account_id=>4444, :deposit_id=>3333}
>> h.class
=> Hash

Ответ 5

если ваш хеш строки является чем-то вроде этого (он может быть вложенным или простым хэшем)

stringify_hash = "{'account_id'=>4444, 'deposit_id'=>3333, 'nested_key'=>{'key1' => val1, 'key2' => val2}}"

вы можете преобразовать его в хэш как это, не используя eval, который опасен

desired_hash = JSON.parse(stringify_hash.gsub("'",'"').gsub('=>',':'))

и для той, которую вы опубликовали, где ключ является символом, который вы можете использовать следующим образом

JSON.parse(string_hash.gsub(':','"').gsub('=>','":'))