Leventix ขอบคุณสำหรับคำตอบ
Marshal.load (Marshal.dump (H))วิธีการอาจจะมีความสมบูรณ์มากที่สุดของวิธีการต่างๆเพราะมันจะเก็บรักษาประเภทหลักเดิมซ้ำ
นี่เป็นสิ่งสำคัญในกรณีที่คุณมีแฮชที่ซ้อนกันซึ่งมีสตริงและคีย์สัญลักษณ์ผสมกันและคุณต้องการเก็บรักษาส่วนผสมนั้นไว้เมื่อถอดรหัส (ตัวอย่างเช่นสิ่งนี้อาจเกิดขึ้นได้หากแฮชของคุณมีอ็อบเจ็กต์ที่กำหนดเองของคุณเองนอกเหนือจากลำดับที่สามที่ซับซ้อน / ซ้อนกันสูง - วัตถุของบุคคลที่มีคีย์ที่คุณไม่สามารถจัดการ / แปลงได้ไม่ว่าด้วยเหตุผลใดก็ตามเช่นข้อ จำกัด ด้านเวลาของโครงการ)
เช่น:
h = {
:youtube => {
:search => 'daffy', # nested symbol key
'history' => ['goofy', 'mickey'] # nested string key
}
}
วิธีที่ 1 : JSON.parse - เป็นสัญลักษณ์ของคีย์ทั้งหมดแบบวนซ้ำ => ไม่เก็บการผสมผสานดั้งเดิม
JSON.parse( h.to_json, {:symbolize_names => true} )
=> { :youtube => { :search=> "daffy", :history => ["goofy", "mickey"] } }
วิธีที่ 2 : ActiveSupport :: JSON.decode - เป็นสัญลักษณ์ของคีย์ระดับบนสุดเท่านั้น => ไม่เก็บส่วนผสมดั้งเดิม
ActiveSupport::JSON.decode( ActiveSupport::JSON.encode(h) ).symbolize_keys
=> { :youtube => { "search" => "daffy", "history" => ["goofy", "mickey"] } }
วิธีที่ 3 : Marshal.load - รักษาการผสมสตริง / สัญลักษณ์ดั้งเดิมในคีย์ที่ซ้อนกัน สมบูรณ์แบบ!
Marshal.load( Marshal.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
เว้นแต่จะมีข้อเสียเปรียบที่ฉันไม่รู้ฉันคิดว่าวิธีที่ 3 คือหนทางที่จะไป
ไชโย
http://stackoverflow.com/a/43773159/1297435
ใช้ราง 4.1