Leventix, grazie per la tua risposta.
Il metodo Marshal.load (Marshal.dump (h)) ha probabilmente la maggiore integrità dei vari metodi perché conserva i tipi di chiave originali in modo ricorsivo .
Questoèimportante nel caso tu abbia un hash nidificato con un mix di stringhe e chiavi di simboli e desideri preservare quel mix dopo la decodifica (ad esempio, ciò potrebbe accadere se il tuo hash contiene i tuoi oggetti personalizzati oltre a terzi altamente complessi / nidificati -oggetto di parti le cui chiavi non è possibile manipolare / convertire per qualsiasi motivo, come un vincolo di tempo del progetto).
Per esempio:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Metodo 1 : JSON.parse - simbolizza tutte le chiavi in modo ricorsivo => Non conserva il mix originale
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Metodo 2 : ActiveSupport :: JSON.decode - simbolizza solo le chiavi di primo livello => Non conserva il mix originale
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Metodo 3 : Marshal.load - conserva la combinazione stringa / simbolo originale nelle chiavi nidificate. PERFETTO!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
A meno che non ci sia un inconveniente di cui non sono a conoscenza, penso che il Metodo 3 sia la strada da percorrere.
Saluti
http://stackoverflow.com/a/43773159/1297435
per rails 4.1