Leventix, dziękuję za odpowiedź.
Metoda Marshal.load (Marshal.dump (h)) prawdopodobnie ma największą integralność spośród różnych metod, ponieważ rekursywnie zachowuje oryginalne typy kluczy .
Jest to ważne w przypadku, gdy masz zagnieżdżony hash z kombinacją kluczy ciągów i symboli i chcesz zachować ten miks podczas dekodowania (na przykład może się to zdarzyć, jeśli twój hash zawiera własne niestandardowe obiekty oprócz bardzo złożonych / zagnieżdżonych trzecich obiekty firmowe, których kluczy nie można modyfikować / konwertować z jakiegokolwiek powodu, np. ograniczenie czasowe projektu).
Na przykład:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Metoda 1 : JSON.parse - rekurencyjnie symbolizuje wszystkie klucze => Nie zachowuje oryginalnego miksu
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Metoda 2 : ActiveSupport :: JSON.decode - symbolizuje tylko klucze najwyższego poziomu => Nie zachowuje oryginalnego miksu
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Metoda 3 : Marshal.load - zachowuje oryginalną kombinację ciągów / symboli w zagnieżdżonych kluczach. IDEALNY!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
O ile nie ma wady, której nie jestem świadomy, myślę, że metoda 3 jest drogą do zrobienia.
Twoje zdrowie
http://stackoverflow.com/a/43773159/1297435
dla szyn 4.1