How to convert a Ruby object to JSON
Asked Answered
D

3

56

I would like to do something like this:

require 'json'

class Person
attr_accessor :fname, :lname
end

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

p.to_json

Is it possible?

Disown answered 12/7, 2010 at 5:24 Comment(0)
D
48

Yes, you can do it with to_json.

You may need to require 'json' if you're not running Rails.

Drawplate answered 12/7, 2010 at 5:37 Comment(1)
With Rails it's not necessary to use require 'json', but with regular Ruby code it's likely to be necessary. JSON is part of Ruby's Standard Library so it comes with the language.Rodl
B
38

To make your Ruby class JSON-friendly without touching Rails, you'd define two methods:

  • to_json, which returns a JSON object
  • as_json, which returns a hash representation of the object

When your object responds properly to both to_json and as_json, it can behave properly even when it is nested deep inside other standard classes like Array and/or 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"
                                #   }
                                # }

Also see "Using custom to_json method in nested objects".

Borchers answered 16/11, 2016 at 21:18 Comment(0)
P
22

Try it. If you're using Ruby on Rails (and the tags say you are), I think this exact code should work already, without requiring anything.

Rails supports JSON output from controllers, so it already pulls in all of the JSON serialization code that you will ever need. If you're planning to output this data through a controller, you might be able to save time by just writing

render :json => @person
Pushover answered 12/7, 2010 at 5:32 Comment(3)
What is Person has associations?Berni
This answer only applies to Rails projects. What about vanilla Ruby?Effects
I'd say it doesn't even apply to Rails.. it only apply to the controller inside a rails app.. very limited scope.Drugge

© 2022 - 2024 — McMap. All rights reserved.