I am using Ruby on Rails 3.2.2 and I would like to "easily" / "quickly" change hash keys from Symbol
s to String
s. That is, from {:one => "Value 1", :two => "Value 2", ...}
to {"one" => "Value 1", "two" => "Value 2", ...}
.
How can I make that by using less code as possible?
simply call stringify_keys
(or stringify_keys!
)
http://apidock.com/rails/Hash/stringify_keys
Use stringify_keys
/stringify_keys!
methods of the Hash
class.
You can also use some_hash.with_indifferent_access
to return a Hash instance where your key can be specified as symbols or as strings with no difference.
stringify_keys
is nice, but only available in Rails.
Here's how I would do it in a single line, with zero dependencies:
new_hash = Hash[your_hash.collect{|k,v| [k.to_s, v]}]
This works on Ruby 1.8.7 and up.
If you are working with Ruby 2.1, you can do:
new_hash = a.collect{|k,v| [k.to_s, v]}.to_h
Note that this solution is not recursive, nor will it handle "duplicate" keys properly. eg. if you have :key
and also "key"
as keys in your hash, the last one will take precedence and overwrite the first one.
stringify_keys from rails
http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys
hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
there is a nice library that does the trick, the library is "facets/hash/rekey"
and the method is rekey!. Se my example below of how to use it. It is just a copy past of
> require 'facets/hash/rekey'
=> true
> a = {:one => "Value 1", :two => "Value 2"}
=> {:one=>"Value 1", :two=>"Value 2"}
> a.rekey!(&:to_s)
=> {"one"=>"Value 1", "two"=>"Value 2"}
> a
=> {"one"=>"Value 1", "two"=>"Value 2"}
new_hash = Hash.new
your_hash.each{ |k,v| new_hash[k.to_s] = v }
new_hash will be same as your_hash but with string keys
I came here to see if there was something better than:
JSON.parse(hash.to_json)
But I think I'll stick with what I have.
You can transfer the key from symbols to strings explicitly:
hash = hash.map { |k, v| [k.to_s, v] }.to_h
hash = hash.transform_keys(&:to_s)
turns all keys from symbols into strings.
More here: https://ruby-doc.org/core-2.6.3/Hash.html#method-i-transform_keys
This was added in ruby 2.5: https://bugs.ruby-lang.org/issues/13583