如何将Ruby对象转换为JSON

kap*_*pso 30 ruby json ruby-on-rails

我想做这样的事情:

require 'json'

class Person
attr_accessor :fname, :lname
end

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

p.to_json
Run Code Online (Sandbox Code Playgroud)

可能吗?

Sal*_*lil 23

是的,你可以做到to_json.

require 'json'如果你没有运行Rails,你可能需要.


Mat*_*chu 20

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

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

render :json => @person
Run Code Online (Sandbox Code Playgroud)

  • 这个答案仅适用于Rails项目.那香草红宝石怎么样? (2认同)
  • 我说它甚至不适用于Rails ..它只适用于rails应用程序内的控制器..范围非常有限. (2认同)

Dmi*_*yas 16

要在不触及Rails的情况下使您的Ruby类JSON友好,您需要定义两种方法:

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

当你的对象正确既响应to_jsonas_json时,可适当的行为,即使它被嵌套在内心深处其他标准类比如阵列和/或哈希:

#!/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"
                                #   }
                                # }
Run Code Online (Sandbox Code Playgroud)

另请参阅" 在嵌套对象中使用自定义to_json方法 ".