Hashのキーを文字列からシンボルに変換する

More than 3 years have passed since last update.

JSONのパースしたときにキーがSymbolじゃなくて困ったのでメモ。

railsだとHash#symbolize_keysがあるけど、rails無しで。

def symbolize_keys(hash)

hash.map{|k,v| [k.to_sym, v] }.to_h
end

hash = {'key':'value', 'key2':'value2'}

symbolize_keys(hash) #=> {:key=>"value", :key2=>"value2"}

Array#to_hはRuby 2.1からの機能なので古い環境では動きません。

hash.inject({}){|h, (k, v)| h[k.to_sym] = v; h}みたいにするといいかも。

追記:

コメントで教えていただきました。

Hash#.[]を使ってHash[ h.map{|k,v| [k.to_sym, v] } ]とする方法もあります。

追記2:

コメントで教えていただきました。

そもそも、JSONのパースで上記のようなことをする必要はありませんでした。

JSON.parsesymbolize_names: trueというオプションを渡すだけです。

ドキュメントはこちら: module function JSON.#parse

JSON.parse('{"key": {"key2": "value2"}}', symbolize_names: true)

#=> {:key=>{:key2=>"value2"}}

参考:

Ruby - Hash#map は Hash を返さない - Qiita