2015-02-04 8 views
6

के साथ रूबी सीरियलाइज स्ट्रक्चर मैं जेएसओएन के लिए एक साधारण संरचना को क्रमबद्ध करने की कोशिश कर रहा हूं जो ठीक काम करता है, लेकिन मैं JSON से उस संरचना का उदाहरण बनाने के लिए इसे प्राप्त नहीं कर सकता। यहां बताया गया है कि मैं इसे कैसे करने की कोशिश कर रहा हूं।जेएसओएन

require 'rubygems' 
require 'json' 

Person = Struct.new(:name, :age) 

json = Person.new('Adam', 19).to_json 
puts json 

me = JSON.load(json) 
puts me.name 

और मैं निम्नलिखित उत्पादन प्राप्त करें:

"#<struct Person name=\"Adam\", age=19>" 
/usr/lib/ruby/1.9.1/json/common.rb:148:in `parse': 746: unexpected token at '"#<struct Person name=\"Adam\", age=19>"' (JSON::ParserError) 
    from /usr/lib/ruby/1.9.1/json/common.rb:148:in `parse' 
    from /usr/lib/ruby/1.9.1/json/common.rb:309:in `load' 
    from why.rb:9:in `<main>' 

उत्तर

10

इस मामले में, person.to_json नहीं कर रहा है कि तुम क्या उम्मीद करते हैं।

आप require 'json', JSON पुस्तकालय सम्मिलित करता है जब एक fallback है कि वहाँ है कि अगर कोई विशेष #to_json कहीं और उपलब्ध कराई गई विधि Object पर एक #to_json विधि। This inserted method मूल रूप से किसी ऑब्जेक्ट पर #to_s#to_json पर कॉल करने जैसा ही है।

अपने Person वर्ग यहाँ के मामले में, #to_sstandard Object#to_s, जो डिफ़ॉल्ट रूप से, एक स्ट्रिंग JSON पुस्तकालय द्वारा parseable प्रदान नहीं करता है आउटपुट।

हालांकि, Struct एक #to_h विधि है कि एक Hash है कि struct कन्वर्ट करने के लिए इस्तेमाल किया जा सकता प्रदान करता है और Hash (JSON पुस्तकालय की आवश्यकता होती है पर) है कैसे एक JSON parseable उत्पादन उत्पन्न करने के लिए के बारे में पता।

तो बस बदल रहा:

json = Person.new('Adam', 19).to_json 
puts json 

रहे हैं:

person = Person.new('Adam', 19) 
puts person.to_h.to_json 

आप क्या उम्मीद करेंगे।

(एक अलग रूप में, मैं वास्तव में सीधे कॉल #to_h#to_jsonLaw of Demeter का उल्लंघन करने वाली Person वर्ग पर #to_json को लागू करने की सिफारिश करेंगे।)

+1

धन्यवाद कि पूरी तरह से काम किया। मैं भविष्य में इसे पढ़ने वाले किसी के लिए भी नोट करना चाहूंगा कि to_h विधि रूबी 2.0 में जोड़ा गया था, इसलिए यदि आप 1.9.3 का उपयोग कर रहे हैं तो मुझे अपग्रेड करना होगा। –