2011-05-02 13 views
5

में लिपटे ऑब्जेक्ट्स पर रूबी to_json मैं एक साइड-प्रोजेक्ट के लिए एक सुपर आसान JSON webservice बनाने की कोशिश कर रहा हूं। हालांकि मुझे अपनी ऑब्जेक्ट्स जेएसओएन में परिवर्तित करने में कुछ परेशानी हो रही है, क्या कोई मेरी मदद कर सकता है?उद्धरण के

मैं निम्नलिखित श्रेणियां होती हैं:

class Location 
    attr_reader :street, :city, :state, :country, :zip, :latitude, :longitude 

    def initialize(street, city, state, country, zip, latitude, longitude) 
    @street = street 
    @city = city 
    @state = state 
    @country = country 
    @zip = zip 
    @latitude = latitude 
    @longitude = longitude 
    end 

    def to_json 
    { 
     'street' => @street, 
     'city' => @city, 
     'state' => @state, 
     'country' => @country, 
     'zip' => @zip, 
     'latitude' => Float(@latitude), 
     'longitude' => Float(@longitude) 
    }.to_json 
    end 
end 

और

class Spot 
    attr_reader :name, :category, :location, :id 

    def initialize(id, name, category, location) 
    @name = name 
    @category = category 
    @location = location 
    @id = id 
    end 

    def to_json 
    { 
     'name' => @name, 
     'category' => @category, 
     'location' => @location.to_json, 
     'id' => @id 
    }.to_json 
    end 

end 

एक यादृच्छिक इनपुट मैं चाहूँगा उत्पादन कुछ इस तरह होना करने के लिए दिया गया है:

{ 
"name":"Wirelab", 
"category":"Bier", 
"location": 
{ 
    "street":"Blaatstraat 12", 
    "city":"Enschede", 
    "state":"Overijssel", 
    "country":"Nederland", 
    "zip":"7542AB", 
    "latitude": 31.21312, 
    "longitude":41.1209 
} 
, 
"id":"12" 
} 

हालांकि ouput मुझे यह मिल जाएगा:

{ 
    "name":"Wirelab", 
    "category":"Bier", 
    "location":" 
    { 
     "street\":"Blaatstraat 12", 
     "city\":\"Enschede\", 
     \"state\":\"Overijssel\", 
     \"country\":\"Nederland\", 
     \"zip\":\"7542AB\", 
     \"latitude\":31.21312, 
     \"longitude\":41.1209 
    } 
    ", 
    "id":"12" 
} 

क्या कोई मुझे बता सकता है कि मैं इसे कैसे ठीक कर सकता हूं?

संपादित करें:

मैं एक Sintra वेब सेवा जो कुछ इस तरह दिखता उपयोग कर रहा हूँ:

get '/spots' do 
     #json = spots.to_json 
     spot = Spot.new("12", "Wirelab", "Bier", Location.new("Blaatstraat 12", "Enschede", "Overijssel", "Nederland", "7542AB", "31.21312", "41.1209")) 
     json = spot.to_json 
     if callback 
     content_type :js 
     response = "#{callback}(#{json})" 
     else 
     content_type :json 
     response = json 
     end 
    response 
end 
+0

आप कैसे करते हैं आउटपुट प्राप्त करें? क्या यह रखता है या निरीक्षण करता है? (आईआरबी में डिफ़ॉल्ट)। आपके उत्तर के लिए – thekindofme

उत्तर

2

यह इसे ठीक करना चाहिए:

class Location 
    attr_reader :street, :city, :state, :country, :zip, :latitude, :longitude 

    def initialize(street, city, state, country, zip, latitude, longitude) 
    @street = street 
    @city = city 
    @state = state 
    @country = country 
    @zip = zip 
    @latitude = latitude 
    @longitude = longitude 
    end 

    def to_hash 
    { 
     'street' => @street, 
     'city' => @city, 
     'state' => @state, 
     'country' => @country, 
     'zip' => @zip, 
     'latitude' => Float(@latitude), 
     'longitude' => Float(@longitude) 
    } 
    end 

    def to_json 
    self.to_hash.to_json 
    end 
end 

class Spot 
    attr_reader :name, :category, :location, :id 

    def initialize(id, name, category, location) 
    @name = name 
    @category = category 
    @location = location 
    @id = id 
    end 

    def to_hash 
    { 
     'name' => @name, 
     'category' => @category, 
     'location' => @location.to_hash, 
     'id' => @id 
    } 
    end 

    def to_json 
    self.to_hash.to_json 
    end 
end 

आपका समस्या यह है कि स्पॉट में अपने to_json में आपको लगता है कि json में स्थान और एन्कोडिंग के लिए json स्ट्रिंग का उपयोग किया गया। यह जेसन स्ट्रिंग के भीतर एक जेसन स्ट्रिंग का कारण बनता है, यही कारण है कि बहुत से '' - बचने वाले पात्रों के रूप में उपयोग किए जाते थे।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। यह वास्तव में काम करता है। @commondream ने सुझाव दिया कि मैं as_json विधि का उपयोग करता हूं जो काम करने लग रहा था। क्या आप यह भी जानते हैं कि मेरा कोड क्यों काम नहीं करता और यह करता है? मुझे – Gidogeek

+1

जानना अच्छा लगेगा आप जेसन में दोगुनी एन्कोडिंग कर रहे थे। उदाहरण के लिए, इसे irb में दर्ज करें: 'json' की आवश्यकता है; रखता है ({'a' => 1} .to_json); डालता है ({'a' => 1} .to_json.to_json) '। – david4dev

+0

इसके लिए धन्यवाद, एक समान समस्या थी और to_hash अच्छी तरह से काम करता है :) –

0

आप उपयोग कर निरीक्षण या आईआरबी से उत्पादन हो रही हैं, तो अर्थात्:

irb> object.to_json 

irb> object.to_json.puts 
का उपयोग करने का प्रयास करें

तो उन स्लेश गायब हो जाना चाहिए।

+0

Thx। मैंने जोड़ा है कि मैं कोड का उपयोग कैसे कर सकता हूं जो यह स्पष्ट करेगा कि इसे कैसे हल किया जाए। पहली बार sinatra का उपयोग कर। – Gidogeek

2

आप इस प्रयास करें:

@object = { 
"name":"Wirelab", 
"category":"Bier", 
"location": 
{ 
    "street":"Blaatstraat 12", 
    "city":"Enschede", 
    "state":"Overijssel", 
    "country":"Nederland", 
    "zip":"7542AB", 
    "latitude": 31.21312, 
    "longitude":41.1209 
} 
, 
"id":"12" 
} 

और अपने ध्यान में रखते हुए ऐसा करने

raw(@object) 

आप होना चाहिए ठीक :)

संपादित

#controller 
@object = Model.all 

view 
raw(@object.to_json) 

भी काम करेंगे ...

+0

आपके उत्तर के लिए धन्यवाद, लेकिन मैं JSON मैन्युअल रूप से क्यों लिखना चाहता हूं? बेशक मैं हमेशा एक ही वस्तु को वापस नहीं कर रहा हूं .. मैंने इसे इस कोड को और अधिक समझने योग्य उदाहरण के लिए हटा दिया है। मुझे खेद है अगर मैं इसके बारे में स्पष्ट नहीं था। – Gidogeek

1

मेरा मानना ​​है कि आपकी समस्या आपके स्थान कक्षा में to_json पद्धति पहले से ही एक स्ट्रिंग रिटर्न है:

def to_json 
    { 
     'street' => @street, 
     'city' => @city, 
     'state' => @state, 
     'country' => @country, 
     'zip' => @zip, 
     'latitude' => Float(@latitude), 
     'longitude' => Float(@longitude) 
    }.to_json # Here, this makes it to return a string 
    end 
end 

और बाद में, अपने Spot कक्षा में, अपने @location स्ट्रिंग के रूप evaluted है

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