Estou me perguntando qual é a melhor maneira de converter um par de valores-chave formatados em json para ruby hash com o símbolo como chave: exemplo:
{ 'user': { 'name': 'foo', 'age': 40, 'location': { 'city' : 'bar', 'state': 'ca' } } }
==>
{ :user=>{ :name => 'foo', :age =>'40', :location=>{ :city => 'bar', :state=>'ca' } } }
Existe um método auxiliar que pode fazer isso?
ruby-on-rails
ruby
json
ez.
fonte
fonte
http://stackoverflow.com/a/43773159/1297435
para rails 4.1Respostas:
usando a gema json ao analisar a string json, você pode passar a opção symbolize_names. Veja aqui: http://flori.github.com/json/doc/index.html (veja em análise)
por exemplo:
fonte
:symbolize_keys
? por que esse nome mudou?symbolize_keys
é coisa do Rails.Leventix, obrigado pela sua resposta.
O método Marshal.load (Marshal.dump (h)) provavelmente tem a maior integridade dos vários métodos porque preserva os tipos de chave originais recursivamente .
Isso é importante no caso de você ter um hash aninhado com uma mistura de strings e chaves de símbolo e deseja preservar essa mistura na decodificação (por exemplo, isso pode acontecer se o seu hash contiver seus próprios objetos personalizados além do terceiro altamente complexo / aninhado -party objetos cujas chaves você não pode manipular / converter por qualquer motivo, como uma restrição de tempo do projeto).
Por exemplo:
Método 1 : JSON.parse - simboliza todas as chaves recursivamente => Não preserva a mistura original
Método 2 : ActiveSupport :: JSON.decode - simboliza apenas as chaves de nível superior => Não preserva a mistura original
Método 3 : Marshal.load - preserva a combinação original de string / símbolo nas chaves aninhadas. PERFEITO!
A menos que haja uma desvantagem da qual eu não saiba, acho que o Método 3 é o melhor.
Felicidades
fonte
Não há nada integrado para fazer o truque, mas não é muito difícil escrever o código para fazê-lo usando a gema JSON. Existe um
symbolize_keys
método embutido no Rails se você estiver usando isso, mas não simboliza as chaves recursivamente como você precisa.Como disse Leventix, a gema JSON só lida com strings entre aspas duplas (o que é tecnicamente correto - JSON deve ser formatado com aspas duplas). Este pedaço de código irá limpar isso antes de tentar analisá-lo.
fonte
Método recursivo:
fonte
Claro, existe uma gema json , mas que trata apenas de aspas duplas.
fonte
JSON.parse(JSON.generate([:a])) # => ["a"]
Marshal.load(Marshal.dump([:a]))
vez disso.Outra maneira de lidar com isso é usar a serialização / desserialização YAML, que também preserva o formato da chave:
Benefício desta abordagem parece ser um formato mais adequado para serviços REST ...
fonte
YAML.load
destina-se a serializar objetos arbitrários (por exemplo, para cache). O propostoYAML.safe_load
foi apresentada alguns meses depois daquela postagem no blog, então é uma questão de usar a coisa certa: github.com/ruby/psych/commit/…A maneira mais conveniente é usando a gem nice_hash: https://github.com/MarioRuiz/nice_hash
fonte