如何将一个Ruby对象转换为JSON

55
我想做类似这样的事情:
require 'json'

class Person
attr_accessor :fname, :lname
end

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

p.to_json

有可能吗?

3个回答

48

是的,你可以通过to_json实现。

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


1
使用Rails时不需要使用require 'json',但是在普通的Ruby代码中可能需要。JSON是Ruby标准库的一部分,因此它随语言一起提供。 - the Tin Man

37

要让你的Ruby类在不触及Rails的情况下具备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"
                                #   }
                                # }

同时请参见"在嵌套对象中使用自定义to_json方法"。


22

试一下吧。如果您正在使用Ruby on Rails(并且标签表明您是),我认为这个精确的代码应该已经可以工作了,不需要任何其他东西。

Rails支持控制器输出JSON格式,因此它已经引入了您所需的所有JSON序列化代码。如果您计划通过控制器输出这些数据,您可能只需编写:

render :json => @person

人物有关联是什么意思? - Sash
3
这个答案仅适用于Rails项目。那么纯粹的Ruby呢? - cevaris
3
我认为这甚至不适用于Rails..它只适用于Rails应用程序内的控制器..范围非常有限。 - baash05

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接