Как преобразовать объект Ruby в JSON - PullRequest
30 голосов
/ 12 июля 2010

Я бы хотел сделать что-то подобное:

require 'json'

class Person
attr_accessor :fname, :lname
end

p = Person.new
p.fname = "Mike"
p.lname = "Smith"

p.to_json

Возможно ли это?

Ответы [ 3 ]

22 голосов
/ 12 июля 2010

Да, вы можете сделать это с to_json.

Возможно, вам понадобится require 'json', если вы не используете Rails.

20 голосов
/ 12 июля 2010

Попробуй. Если вы используете Ruby on Rails (а теги говорят, что это так), я думаю, что этот точный код уже должен работать, ничего не требуя.

Rails поддерживает вывод JSON с контроллеров, поэтому он уже извлекает весь код сериализации JSON, который вам когда-либо понадобится. Если вы планируете выводить эти данные через контроллер, вы можете сэкономить время, просто написав

render :json => @person
16 голосов
/ 17 ноября 2016

Чтобы сделать ваш Ruby-класс дружественным к JSON, не касаясь Rails, вы должны определить два метода:

  • to_json, который возвращает объект JSON
  • as_json, который возвращает хеш-представление объекта

Когда ваш объект правильно реагирует на to_json и as_json, он может вести себя правильно, даже если он вложен глубоко в другие стандартные классы, такие как Array и / или Hash:

#!/usr/bin/env ruby

require 'json'

class Person

    attr_accessor :fname, :lname

    def as_json(options={})
        {
            fname: @fname,
            lname: @lname
        }
    end

    def to_json(*options)
        as_json(*options).to_json(*options)
    end

end

p = Person.new
p.fname = "Mike"
p.lname = "Smith"

# case 1
puts p.to_json                  # output: {"fname":"Mike","lname":"Smith"}

# case 2
puts [p].to_json                # output: [{"fname":"Mike","lname":"Smith"}]

# case 3
h = {:some_key => p}
puts h.to_json                  # output: {"some_key":{"fname":"Mike","lname":"Smith"}}

puts JSON.pretty_generate(h)    # output
                                # {
                                #   "some_key": {
                                #     "fname": "Mike",
                                #     "lname": "Smith"
                                #   }
                                # }

Также см. « Использование собственного метода to_json во вложенных объектах ».

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