2012-02-20 17 views
16

के लिए डॉट सिंटैक्स का उपयोग करने में असमर्थ मैं याहू प्लेसमेकर एपीआई से कुछ जेसन डेटा खींचने के लिए net/http का उपयोग कर रहा हूं। प्रतिक्रिया प्राप्त करने के बाद मैं प्रतिक्रिया पर JSON.parse प्रदर्शन कर रहा हूं।रूबी हैश

{"processingTime"=>"0.001493", "version"=>"1.4.0.526 build 111113", "documentLength"=>"25", "document"=>{"administrativeScope"=>{"woeId"=>"2503863", "type"=>"Town", "name"=>"Tampa, FL, US", "centroid"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}}, "geographicScope"=>{"woeId"=>"2503863", "type"=>"Town", "name"=>"Tampa, FL, US", "centroid"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}}, "localScopes"=>{"localScope"=>{"woeId"=>"2503863", "type"=>"Town", "name"=>"Tampa, FL, US (Town)", "centroid"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}, "southWest"=>{"latitude"=>"27.8132", "longitude"=>"-82.6489"}, "northEast"=>{"latitude"=>"28.1714", "longitude"=>"-82.2539"}, "ancestors"=>[{"ancestor"=>{"woeId"=>"12587831", "type"=>"County", "name"=>"Hillsborough"}}, {"ancestor"=>{"woeId"=>"2347568", "type"=>"State", "name"=>"Florida"}}, {"ancestor"=>{"woeId"=>"23424977", "type"=>"Country", "name"=>"United States"}}]}}, "extents"=>{"center"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}, "southWest"=>{"latitude"=>"27.8132", "longitude"=>"-82.6489"}, "northEast"=>{"latitude"=>"28.1714", "longitude"=>"-82.2539"}}, "placeDetails"=>{"placeId"=>"1", "place"=>{"woeId"=>"2503863", "type"=>"Town", "name"=>"Tampa, FL, US", "centroid"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}}, "placeReferenceIds"=>"1", "matchType"=>"0", "weight"=>"1", "confidence"=>"8"}, "referenceList"=>{"reference"=>{"woeIds"=>"2503863", "placeReferenceId"=>"1", "placeIds"=>"1", "start"=>"15", "end"=>"20", "isPlaintextMarker"=>"1", "text"=>"Tampa", "type"=>"plaintext", "xpath"=>""}}}} 

मैं jsonResponse['version'] तरह बातें करके तत्वों उपयोग करने में सक्षम हूँ, लेकिन मैं jsonResponse.version ऐसा करने में सक्षम नहीं कर रहा हूँ: यह मैं एक हैश ऐसा दिखता है जैसे देता है। ऐसा क्यों है?

+0

मुझे नहीं लगता कि रूबी इसका समर्थन करता है। –

उत्तर

42

Hash के माध्यम से यह कुंजी है के लिए डॉट वाक्य रचना नहीं है कर सकते हैं। OpenStruct करता है:

require 'ostruct' 
hash = {:name => 'John'} 
os = OpenStruct.new(hash) 
p os.name #=> "John" 
+0

केवल एक स्तर के बिंदुओं के लिए os.name.firstname काम नहीं कर रहा है, os.name एक सामान्य हैश – teknopaul

+0

देता है यह नेस्टेड हैश और सरणी के लिए काम नहीं करता है। नीचे whodabudda का जवाब देखें। –

5

यह एक जावास्क्रिप्ट सुविधा है, रूबी सुविधा नहीं। रुबी में, "डॉट सिंटैक्स" का उपयोग करने के लिए, ऑब्जेक्ट को उन तरीकों का जवाब देना होगा। रूबी हैश तत्वों तक पहुंचने के लिए #[](key) विधि का उपयोग करें।

4

क्यों नहीं, तो आप इस metaprogramming

module LookLikeJSON 
    def method_missing(meth, *args, &block) 
    if has_key?(meth.to_s) 
     self[meth.to_s] 
    else 
     raise NoMethodError, 'undefined method #{meth} for #{self}' 
    end 
    end 
end 

h = {"processingTime"=>"0.001493", "version"=>"1.4.0.526 build 111113", "documentLength"=>"25"} 
h.extend(LookLikeJSON) 
h.processingTime #=> "0.001493" 
+2

सही, लेकिन परेशान क्यों? – d11wtq

+1

+1: यह वही है जो मैं करता हूं! :) –

+0

सिंगल कोट में इंटरपोलेट स्ट्रिंग? :/और पहले कुंजी को सामान्य करने के लिए 'stringify_keys!' का उपयोग कर। –

0

क्योंकि Hash एक version विधि नहीं है।

8

HashDot मणि इसके लिए काम करेगा।

हैशडॉट हैश पर डॉट नोटेशन सिंटैक्स उपयोग की अनुमति देता है। यह जेसन स्ट्रिंग्स पर भी काम करता है जिन्हें JSON.parse के साथ फिर से पार्स किया गया है।

require 'hash_dot' 

hash = {b: {c: {d: 1}}}.to_dot 
hash.b.c.d => 1 

json_hash = JSON.parse(hash.to_json) 
json_hash.b.c.d => 1 
+0

अच्छा मणि! धन्यवाद! – Richard

9

OpenStruct एक शुद्ध हैश के लिए अच्छी तरह से काम करेंगे, लेकिन embeded सरणियों या अन्य हैश साथ हैश के लिए, डॉट वाक्य रचना गला घोंटना होगा। https://coderwall.com/p/74rajw/convert-a-complex-nested-hash-to-an-object बुनियादी कदम हैं:

data = YAML::load(File.open("your yaml file")) 
json_data = data.to_json 
mystr = JSON.parse(json_data,object_class: OpenStruct) 

आप अब डॉट सिंटैक्स का उपयोग mystr में सभी वस्तुओं का उपयोग कर सकते मैं इस समाधान है, जो एक और मणि में लोड हो रहा है बिना अच्छी तरह से काम भर में आया था।

+0

"चूंकि JSON और OpenStruct दोनों रूबी मानक लाइब्रेरी में हैं, इसलिए हमारे पास कोई तृतीय-पक्ष निर्भरता नहीं होगी।" –

+0

यह सबसे अच्छा जवाब है और इसे स्वीकार किया जाना चाहिए। –

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