Me pregunto cuál es la mejor manera de convertir un par de valores clave con formato json a hash ruby con el símbolo como clave: ejemplo:
{ 'user': { 'name': 'foo', 'age': 40, 'location': { 'city' : 'bar', 'state': 'ca' } } }
==>
{ :user=>{ :name => 'foo', :age =>'40', :location=>{ :city => 'bar', :state=>'ca' } } }
¿Hay algún método auxiliar que pueda hacer esto?
ruby-on-rails
ruby
json
ez.
fuente
fuente
http://stackoverflow.com/a/43773159/1297435
para rails 4.1Respuestas:
usando la gema json al analizar la cadena json, puede pasar la opción symbolize_names. Ver aquí: http://flori.github.com/json/doc/index.html (busque debajo de parse)
p.ej:
fuente
:symbolize_keys
? ¿Por qué cambió ese nombre?symbolize_keys
es cosa de Rails.Leventix, gracias por tu respuesta.
El método Marshal.load (Marshal.dump (h)) probablemente tiene la mayor integridad de los varios métodos porque conserva los tipos de clave originales de forma recursiva .
Esto es importante en caso de que tenga un hash anidado con una combinación de claves de cadena y símbolo y desee conservar esa combinación al decodificar (por ejemplo, esto podría suceder si su hash contiene sus propios objetos personalizados además de un tercero altamente complejo / anidado -objetos de fiesta cuyas claves no puede manipular / convertir por cualquier motivo, como una restricción de tiempo del proyecto).
P.ej:
Método 1 : JSON.parse: simboliza todas las claves de forma recursiva => No conserva la mezcla original
Método 2 : ActiveSupport :: JSON.decode - simboliza solo claves de nivel superior => No conserva la mezcla original
Método 3 : Marshal.load: conserva la combinación original de cadena / símbolo en las claves anidadas. ¡PERFECTO!
A menos que haya un inconveniente que desconozco, creo que el Método 3 es el camino a seguir.
Salud
fuente
No hay nada integrado para hacer el truco, pero no es demasiado difícil escribir el código para hacerlo usando la gema JSON. Hay un
symbolize_keys
método integrado en Rails si lo está utilizando, pero eso no simboliza las teclas de forma recursiva como necesita.Como dijo Leventix, la gema JSON solo maneja cadenas entre comillas dobles (lo cual es técnicamente correcto; JSON debe formatearse con comillas dobles). Este fragmento de código lo limpiará antes de intentar analizarlo.
fuente
Método recursivo:
fuente
Por supuesto, hay una gema json , pero solo maneja comillas dobles.
fuente
JSON.parse(JSON.generate([:a])) # => ["a"]
Marshal.load(Marshal.dump([:a]))
lugar.Otra forma de manejar esto es usar la serialización / deserialización YAML, que también conserva el formato de la clave:
Benefíciese de este enfoque, parece un formato que se adapta mejor a los servicios REST ...
fuente
YAML.load
está destinado a serializar objetos arbitrarios (por ejemplo, para caché). La propuestaYAML.safe_load
se presentó unos meses después de esa publicación del blog, por lo que es una cuestión de usar lo correcto: github.com/ruby/psych/commit/…La forma más conveniente es usar la gema nice_hash: https://github.com/MarioRuiz/nice_hash
fuente