5 Stimmen

Ruby to_json bei Objekten, die in Anführungszeichen eingeschlossen sind.

Ich versuche, einen super einfachen JSON-Webservice für ein Nebenprojekt zu erstellen. Allerdings habe ich Probleme beim Konvertieren meiner Objekte in JSON, könnte mir bitte jemand helfen ?

Ich habe folgende Klassen:

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

und

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

Bei einer beliebigen Eingabe möchte ich folgendes Ausgabeformat erhalten:

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

Allerdings ist die Ausgabe, die ich erhalte, folgende:

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

Könnte mir jemand bitte erklären, wie ich das beheben kann?

EDIT:

Ich verwende einen Sintra-Webservice, der ungefähr so aussieht:

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

2voto

Wenn Sie dies versuchen:

@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"
}

Und dies in Ihrer Ansicht tun

raw(@object)

Sollten Sie in Ordnung sein :)

bearbeiten

#controller
@object = Model.all

anzeigen
raw(@object.to_json)

wird auch funktionieren...

2voto

david4dev Punkte 4776

Dies sollte es beheben:

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

Ihr Problem war, dass Sie in Ihrem to_json in Spot den json-String für Location verwendet haben und diesen in json encodiert haben. Dies führt zu einem json-String innerhalb des json-Strings, weshalb viele '\'s vorhanden waren - die als Escape-Zeichen verwendet wurden.

1voto

Vlad Khomich Punkte 5610

Ich glaube, dein Problem ist, dass die to_json-Methode in deiner Location-Klasse bereits einen String zurückgibt:

def to_json
    {
      'street' => @street,
      'city' => @city,
      'state' => @state,
      'country' => @country,
      'zip' => @zip,
      'latitude' => Float(@latitude),
      'longitude' => Float(@longitude)
    }.to_json  # Hier wird es zu einem String gemacht
  end
end

Und später, in deiner Spot-Klasse, wird dein @location als String ausgewertet

0voto

thekindofme Punkte 3786

Wenn Sie Inspect verwenden oder die Ausgabe von irb erhalten, d. h.:

irb> object.to_json

Versuchen Sie es mit puts

irb> object.to_json.puts

dann sollten diese Schrägstriche verschwinden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X