Leventix, merci pour votre réponse.
La méthode Marshal.load (Marshal.dump (h)) a probablement le plus d'intégrité des différentes méthodes car elle préserve les types de clé d'origine de manière récursive .
Ceci est important dans le cas où vous avez un hachage imbriqué avec un mélange de clés de chaîne et de symbole et que vous souhaitez conserver ce mélange lors du décodage (par exemple, cela peut se produire si votre hachage contient vos propres objets personnalisés en plus d'un tiers très complexe / imbriqué -party objets dont vous ne pouvez pas manipuler / convertir les clés pour une raison quelconque, comme une contrainte de temps de projet).
Par exemple:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Méthode 1 : JSON.parse - symbolise toutes les clés de manière récursive => Ne conserve pas le mélange d'origine
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Méthode 2 : ActiveSupport :: JSON.decode - symbolise uniquement les clés de niveau supérieur => Ne conserve pas le mélange d'origine
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Méthode 3 : Marshal.load - préserve le mélange chaîne / symbole d'origine dans les clés imbriquées. PARFAIT!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
À moins qu'il y ait un inconvénient dont je ne suis pas conscient, je pense que la méthode 3 est la voie à suivre.
À votre santé
http://stackoverflow.com/a/43773159/1297435
pour les rails 4.1