2011-03-04 9 views
5

मैं एक हैश को क्रमबद्ध और deserialize करने की कोशिश कर रहा हूँ। जब हैश deserailized है, चाबियाँ डी-प्रतीक हैं; जैसे अधिक नहीं: एक, बल्कि "एक"।ActiveSupport :: JSON डीकोड हैश खोने वाले प्रतीकों

रेल कंसोल से:

>>h = { :one =>1, :two => "two"} 
{:one=>1, :two=>"two"} 
>>j = ActiveSupport::JSON.encode(h) 
"{\"one\":1,\"two\":\"two\"}" 
>>h2 = ActiveSupport::JSON.decode(j) 
{"one"=>1, "two"=>"two"} 
>>h2[:one] 
nil 
>>h[:one] 
1 

मैं अब के लिए Marshal.dump/लोड का उपयोग कर अपना ली है। हालांकि, मैं यह देखने के लिए वहां फेंकना चाहता था कि JSON में इसे रखने का कोई तरीका था (केवल पठनीयता के लिए)।

उत्तर

8
h2 = ActiveSupport::JSON.decode(j).symbolize_keys 
+5

नोट: इस कुंजी का प्रतीक नहीं है रिकर्सिवली। – TelegramSam

+0

न ही जेएसओएन ऑब्जेक्ट्स युक्त एक सरणी के लिए काम करता है i.e. '[{'id': 1}, {'id': '2'}, ...]'। टिम कूल समाधान काम करता है। – laffuste

16

JSON.parse(j, {:symbolize_names => true}) थोड़ा बेहतर होना चाहिए यह (मुझे लगता है) कभी नहीं पहली जगह में स्ट्रिंग कुंजी बनाता है और इसलिए एक ही कुंजी के साथ बड़े हैश के लिए स्मृति का संरक्षण क्योंकि बार दोहराया

+0

मुझे लगता है कि लोग वास्तव में क्या चाहते हैं एक https://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess इसलिए यह रेल की तरह काम करता है डिफ़ॉल्ट रूप से करता है, यानी: दोनों 'h [' one ']' और 'h [: one ] ' – Magne

+0

तो:' JSON.parse (j, {: symbolize_names => true})। With_indifferent_access'। ध्यान दें कि यह केवल रेल में काम करता है, उदाहरण के लिए पृष्ठभूमि प्रक्रियाओं द्वारा निष्पादित सादे पुराने रूबी वर्गों को हैश विधि '.with_indifferent_access' तक पहुंच नहीं हो सकती है जो ActiveSupport परिभाषित करता है। – Magne

+0

पीएस: यह भी रिकर्सिव रूप से कुंजी का प्रतीक है। – Magne

संबंधित मुद्दे