JSON को रूबी हैश में कैसे बदलें


137

मेरे पास एक JSON ऑब्जेक्ट है जो निम्न मान रखता है:

@value = {"val":"test","val1":"test1","val2":"test2"}

मैं रूबी में कुंजी / मूल्य जोड़े प्राप्त करने के लिए इसके माध्यम से लूप करना चाहता हूं। जब मैं उपयोग @eachकरता हूं , तो यह ऑब्जेक्ट के माध्यम से पुनरावृत्ति नहीं करता है क्योंकि यह रूबी हैश रूप में नहीं है:

@value = {"val"=>"test","val1"=>"test1","val2"=>"test2"}

मैं उपरोक्त JSON ऑब्जेक्ट को रूबी हैश में कैसे बदल सकता हूं?

जवाबों:


250

निम्नलिखित स्निपेट के बारे में क्या?

require 'json'
value = '{"val":"test","val1":"test1","val2":"test2"}'
puts JSON.parse(value) # => {"val"=>"test","val1"=>"test1","val2"=>"test2"}

7
value = '{"val":"test","val1":"test1","val2":"test2"}'अधिक पठनीय हो सकता था।
भाग्यशालीकृष्ण

40

आप रेल के with_indifferent_accessतरीके का उपयोग भी कर सकते हैं ताकि आप प्रतीकों या तारों के साथ शरीर तक पहुंच सकें।

value = '{"val":"test","val1":"test1","val2":"test2"}'
json = JSON.parse(value).with_indifferent_access

फिर

json[:val] #=> "test"

json["val"] #=> "test"

क्या किसी को पता है कि यह बड़ी हैश वस्तुओं के लिए अधिक संसाधन-गहन है? मैं रूबी / रेल्स के लिए नया हूं, लेकिन इस डुप्लिकेट्स को कुंजी-मूल्य वाले जोड़े मानते हैं?
जोनाथन

4

यह मानते हुए कि आपके पास JSON हैश कहीं पर लटका हुआ है, स्वचालित रूप से इसे वारहॉग के संस्करण की तरह कुछ में बदलने के लिए, %q{hsh}टैग में अपनी JSON हैश सामग्री लपेटें ।

ऐसा लगता है कि वारहॉग के उत्तर में सभी आवश्यक बच गए पाठ को स्वचालित रूप से जोड़ दिया गया है।


4

क्या आपने कोशिश की है: http://flori.github.com/json/ ?

असफल होने पर, आप इसे बाहर पार्स कर सकते हैं? यदि यह केवल सरणियाँ हैं जिसमें आप रुचि रखते हैं, तो ऊपर से विभाजित करने के लिए कुछ काफी सरल होगा।


1

मुझे आश्चर्य है कि किसी ने JSON की []विधि नहीं बताई , जो इसे / JSON से डिकोड और एनकोड करने के लिए बहुत आसान और पारदर्शी बनाता है।

यदि ऑब्जेक्ट स्ट्रिंग-जैसा है, तो स्ट्रिंग को पार्स करें और रूबी डेटा संरचना के रूप में पार्स किए गए परिणाम लौटाएं। अन्यथा रूबी डेटा संरचना ऑब्जेक्ट से एक JSON टेक्स्ट उत्पन्न करें और इसे वापस करें।

इस पर विचार करो:

require 'json'

hash = {"val":"test","val1":"test1","val2":"test2"} # => {:val=>"test", :val1=>"test1", :val2=>"test2"}
str = JSON[hash] # => "{\"val\":\"test\",\"val1\":\"test1\",\"val2\":\"test2\"}"

strअब JSON एन्कोडेड शामिल है hash

इसका उपयोग करके इसे उल्टा करना आसान है:

JSON[str] # => {"val"=>"test", "val1"=>"test1", "val2"=>"test2"}

कस्टम ऑब्जेक्ट्स to_sको वर्ग के लिए परिभाषित करने की आवश्यकता होती है, और इसके अंदर ऑब्जेक्ट को हैश में परिवर्तित करते हैं फिर उपयोग करते हैंto_json पर करते हैं।


0

आप अच्छा_हाश रत्न: https://github.com/MarioRuiz/nice_hash का उपयोग कर सकते हैं

require 'nice_hash'
my_string = '{"val":"test","val1":"test1","val2":"test2"}'

# on my_hash will have the json as a hash, even when nested with arrays
my_hash = my_string.json

# you can filter and get what you want even when nested with arrays
vals = my_string.json(:val1, :val2)

# even you can access the keys like this:
puts my_hash._val1
puts my_hash.val1
puts my_hash[:val1]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.