Leventix, vielen Dank für Ihre Antwort.
Die Marshal.load- Methode (Marshal.dump (h)) weist wahrscheinlich die Integrität der verschiedenen Methoden auf, da die ursprünglichen Schlüsseltypen rekursiv beibehalten werden .
Dies ist wichtig, wenn Sie einen verschachtelten Hash mit einer Mischung aus Zeichenfolgen- und Symbolschlüsseln haben und diese Mischung beim Dekodieren beibehalten möchten (dies kann beispielsweise passieren, wenn Ihr Hash neben hochkomplexen / verschachtelten dritten auch Ihre eigenen benutzerdefinierten Objekte enthält -Party-Objekte, deren Schlüssel Sie aus irgendeinem Grund nicht bearbeiten / konvertieren können (z. B. eine Projektzeitbeschränkung).
Z.B:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Methode 1 : JSON.parse - symbolisiert alle Schlüssel rekursiv => Bewahrt nicht die ursprüngliche Mischung
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Methode 2 : ActiveSupport :: JSON.decode - symbolisiert nur Schlüssel der obersten Ebene => Erhält nicht die ursprüngliche Mischung
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Methode 3 : Marshal.load - behält die ursprüngliche Zeichenfolge / Symbol-Mischung in den verschachtelten Schlüsseln bei. PERFEKT!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
Wenn es keinen Nachteil gibt, den ich nicht kenne, würde ich denken, dass Methode 3 der richtige Weg ist.
Prost
http://stackoverflow.com/a/43773159/1297435
für Rails 4.1