Ruby to_json для объектов, заключенных в цитаты - PullRequest
5 голосов
/ 02 мая 2011

Я пытаюсь создать очень простой веб-сервис JSON для побочного проекта.Однако у меня возникли проблемы с преобразованием моих объектов в JSON. Может, кто-нибудь мне поможет?

У меня есть следующие классы:

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

Однако я получу следующий вывод:

{
    "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

Ответы [ 4 ]

2 голосов
/ 02 мая 2011

Если вы попробуете это:

@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)

тоже будет работать ...

2 голосов
/ 02 мая 2011

Это должно исправить:

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 в Spot вы использовали строку json для Location и кодировали ее в json.Это приводит к появлению строки json внутри строки json, поэтому было много символов \, используемых в качестве escape-символов.

1 голос
/ 02 мая 2011

Я считаю, что ваша проблема в том, что метод to_json в вашем классе Location уже возвращает строку:

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 оценивается как строка

0 голосов
/ 02 мая 2011

Если вы используете inspect или получаете вывод из irb, то есть:

irb> object.to_json

Попробуйте использовать путы

irb> object.to_json.puts

тогда эти косые черты должны исчезнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...