How to convert a Ruby object to JSON

后端 未结 3 787
我在风中等你
我在风中等你 2020-12-09 01:38

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\         


        
相关标签:
3条回答
  • 2020-12-09 02:13

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

    0 讨论(0)
  • 2020-12-09 02:26

    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
    
    0 讨论(0)
  • 2020-12-09 02:34

    Yes, you can do it with to_json.

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

    0 讨论(0)
提交回复
热议问题