Leventix, cảm ơn bạn đã trả lời.
Phương thức Marshal.load (Marshal.dump (h)) có lẽ có tính toàn vẹn nhất trong số các phương thức khác nhau vì nó bảo toàn các kiểu khóa ban đầu một cách đệ quy .
Điều này quan trọng trong trường hợp bạn có một băm lồng nhau với hỗn hợp các khóa chuỗi và ký hiệu và bạn muốn bảo toàn hỗn hợp đó khi giải mã (ví dụ: điều này có thể xảy ra nếu băm của bạn chứa các đối tượng tùy chỉnh của riêng bạn ngoài thứ ba có độ phức tạp cao / lồng nhau -đối tượng bên có khóa mà bạn không thể thao tác / chuyển đổi vì bất kỳ lý do gì, như giới hạn thời gian của dự án).
Ví dụ:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
Phương pháp 1 : JSON.parse - tượng trưng cho tất cả các khóa một cách đệ quy => Không bảo toàn hỗn hợp gốc
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
Phương pháp 2 : ActiveSupport :: JSON.decode - chỉ tượng trưng cho các khóa cấp cao nhất => Không bảo toàn hỗn hợp gốc
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
Phương pháp 3 : Marshal.load - bảo tồn hỗn hợp chuỗi / ký hiệu ban đầu trong các khóa lồng nhau. HOÀN HẢO!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
Trừ khi có một nhược điểm mà tôi không biết, tôi nghĩ Phương pháp 3 là cách để đi.
Chúc mừng
http://stackoverflow.com/a/43773159/1297435
cho rails 4.1