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:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Método 1 : JSON.parse: simboliza todas las claves de forma recursiva => No conserva la mezcla original
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Método 2 : ActiveSupport :: JSON.decode - simboliza solo claves de nivel superior => No conserva la mezcla original
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Método 3 : Marshal.load: conserva la combinación original de cadena / símbolo en las claves anidadas. ¡PERFECTO!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
A menos que haya un inconveniente que desconozco, creo que el Método 3 es el camino a seguir.
Salud
http://stackoverflow.com/a/43773159/1297435
para rails 4.1