लेवेंटिक्स, आपके उत्तर के लिए धन्यवाद।
Marshal.load (Marshal.dump (ज)) , क्योंकि यह मूल कुंजी प्रकार को बरकरार रखता है विधि शायद विभिन्न तरीकों से ज्यादातर अखंडता है रिकर्सिवली ।
यह महत्वपूर्ण है कि आपके पास स्ट्रिंग और प्रतीक कुंजियों के मिश्रण के साथ नेस्टेड हैश है और आप डिकोड पर मिश्रण को संरक्षित करना चाहते हैं (उदाहरण के लिए, यह तब हो सकता है जब आपके हैश में अत्यधिक जटिल / नेस्टेड तीसरे के अलावा आपके स्वयं के कस्टम ऑब्जेक्ट शामिल हों -पार्टी ऑब्जेक्ट्स जिनकी कुंजियाँ आप किसी भी कारण से जोड़ / तब्दील नहीं कर सकते हैं, जैसे प्रोजेक्ट टाइम की कमी)।
उदाहरण के लिए:
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.dump(h) )
=> { :youtube => { :search => "daffy", "history" => ["goofy", "mickey"] } }
जब तक कोई कमी नहीं है कि मैं अनजान हूँ, मुझे लगता है कि विधि 3 जाने का रास्ता है।
चियर्स
http://stackoverflow.com/a/43773159/1297435रेल के लिए यह प्रयास करें 4.1