रूबी में एक JSON स्ट्रिंग पार्स करना


359

मेरे पास एक स्ट्रिंग है जिसे मैं रूबी में पार्स करना चाहता हूं:

string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'

क्या डेटा निकालने का एक आसान तरीका है?


22
JSON को रूबी में सीधे समर्थन दिया गया है, और कम से कम रूबी v1.9.3 के बाद से किया गया है, इसलिए जब तक आप कुछ पुराने का उपयोग नहीं कर रहे हैं, तब तक एक रत्न स्थापित करने की कोई आवश्यकता नहीं है। बस require 'json'अपने कोड में उपयोग करें।
टिन मैन

जवाबों:


559

यह जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) जैसा दिखता है । आप JSON को पार्स कर सकते हैं जो कुछ चर में रहता है, उदाहरण के लिए json_string, जैसे:

require 'json'
JSON.parse(json_string)

यदि आप एक पुरानी रूबी का उपयोग कर रहे हैं, तो आपको json मणि स्थापित करने की आवश्यकता हो सकती है ।


रूबी के लिए JSON के अन्य कार्यान्वयन भी हैं जो कुछ उपयोग-मामलों को बेहतर ढंग से फिट कर सकते हैं:


32
इसके अलावा, आप प्रतीकों के रूप में कुंजी प्राप्त करने के लिए, symbolize_names को सही पर सेट कर सकते हैं। छूट:JSON.parse(string, symbolize_names: true) #=> {key: :value}
नंदो सूसा

31
JSON को रूबी में सीधे समर्थन दिया गया है, और कम से कम रूबी v1.9.3 के बाद से किया गया है, इसलिए जब तक आप कुछ पुराने का उपयोग नहीं कर रहे हैं, तब तक एक रत्न स्थापित करने की कोई आवश्यकता नहीं है। बस require 'json'अपने कोड में उपयोग करें।
टिन मैन

212

बस पार्स की गई वस्तु के साथ क्या करना है, इसके जवाबों को थोड़ा विस्तार देना है:

# JSON Parsing example
require "rubygems" # don't need this if you're Ruby v1.9.3 or higher
require "json"

string = '{"desc":{"someKey":"someValue","anotherKey":"value"},"main_item":{"stats":{"a":8,"b":12,"c":10}}}'
parsed = JSON.parse(string) # returns a hash

p parsed["desc"]["someKey"]
p parsed["main_item"]["stats"]["a"]

# Read JSON from a file, iterate over objects
file = open("shops.json")
json = file.read

parsed = JSON.parse(json)

parsed["shop"].each do |shop|
  p shop["id"]
end

बहुत अच्छी तरह से समझाया।
berto77

7
महत्वपूर्ण नोट: '{ "a": "bob" }'मान्य है। "{ 'a': 'bob' }"नहीं है।
जिगी

7
@LinusAn क्योंकि JSON तार के आसपास दोहरे उद्धरण चिह्नों की आवश्यकता है। JSON परिभाषा में स्ट्रिंग देखें ( json.org ): "एक स्ट्रिंग शून्य या अधिक यूनिकोड वर्णों का एक क्रम है, जो दोहरे उद्धरण चिह्नों में लिपटा है, बैकस्लैश एस्केप का उपयोग करता है।"
एंडोरामा

1
कई मामलों में आप के लिए JSON.parseएक बचाव ब्लॉक के भीतर लपेट करना चाहते हैं JSON::ParserError
जॉन्हेल

JSON.parse("[#{value}]")[0]त्रुटि से बचने के लिएA JSON text must at least contain two octets!
रिविफॉल

39

रूबी v1.9.3 के रूप में, आपको JSON को पार्स करने के लिए किसी भी रत्न को स्थापित करने की आवश्यकता नहीं है, बस उपयोग करें require 'json':

require 'json'

json = JSON.parse '{"foo":"bar", "ping":"pong"}'
puts json['foo'] # prints "bar"

रूबी-डॉक्टर पर JSON देखें ।


15

यह JSON स्ट्रिंग जैसा दिखता है। आप कई JSON पुस्तकालयों में से एक का उपयोग कर सकते हैं और यह करना जितना आसान है:

JSON.parse(string)

7

यह थोड़ा देर से है, लेकिन मैं कुछ दिलचस्प में भाग गया जो योगदान के लिए महत्वपूर्ण लगता है।

मैंने गलती से यह कोड लिखा था, और यह काम करने लगता है:

require 'yaml'
CONFIG_FILE = ENV['CONFIG_FILE'] # path to a JSON config file 
configs = YAML.load_file("#{CONFIG_FILE}")
puts configs['desc']['someKey']

मैं इसे देखने के लिए आश्चर्यचकित था क्योंकि मैं YAML पुस्तकालय का उपयोग कर रहा हूं, लेकिन यह काम करता है।

कारण यह है कि यह महत्वपूर्ण है कि yamlरूबी के साथ बिल्ट-इन आता है ताकि कोई मणि स्थापित न हो।

मैं 1.8.x और 1.9.x संस्करणों का उपयोग कर रहा हूं - इसलिए json पुस्तकालय में निर्मित नहीं है, लेकिन यह संस्करण 2.x में है।

तो तकनीकी रूप से - यह 2.0 से कम संस्करण में डेटा निकालने का सबसे आसान तरीका है।


हां, JSON वास्तव में साइक कोड द्वारा पार्स किया गया है, जो Ruby में YAML को भी पार्स करता है। और JSON पार्सिंग रूबी v1.9.3 में पेश किया गया था ।
टिन मैन

1
इसका कारण यह है कि शब्दार्थ (अधिकांश) JSON मान्य YAML है (विशेष रूप से YAML 1.2)
जस्टिन ओम


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.