如何将Ruby对象转换为JSON

时间:2010-07-12 05:24:42

标签: ruby-on-rails ruby json

我想做这样的事情:

require 'json'

class Person
attr_accessor :fname, :lname
end

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

p.to_json

有可能吗?

3 个答案:

答案 0 :(得分:22)

是的,您可以使用to_json

如果您没有运行Rails,则可能需要require 'json'

答案 1 :(得分:20)

试试吧。如果你正在使用Ruby on Rails(并且标签说你是),我认为这个确切的代码应该已经可以使用,而不需要任何东西。

Rails支持来自控制器的JSON输出,因此它已经提取了您将需要的所有JSON序列化代码。如果您计划通过控制器输出此数据,则可以通过编写

来节省时间
render :json => @person

答案 2 :(得分:15)

为了使您的Ruby类JSON友好而不触及Rails,您需要定义两种方法:

  • to_json,返回JSON对象
  • as_json,返回对象的哈希表示

当您的对象对to_jsonas_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"
                                #   }
                                # }

另见“Using custom to_json method in nested objects”。