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.parse
にsymbolize_names: true
というオプションを渡すだけです。
ドキュメントはこちら: module function JSON.#parse
JSON.parse('{"key": {"key2": "value2"}}', symbolize_names: true)
#=> {:key=>{:key2=>"value2"}}