2010-07-12 144 views
24

我愿做这样的事情:如何将Ruby对象转换成JSON

require 'json' 

class Person 
attr_accessor :fname, :lname 
end 

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

p.to_json 

这可能吗?

回答

19

试试吧。如果您使用的是Ruby on Rails(并且标签上显示您是这样),我认为这个确切的代码应该已经工作了,而不需要任何东西。

Rails支持来自控制器的JSON输出,因此它已经引入了您将需要的所有JSON序列化代码。如果您打算通过输出控制器这个数据,你也许能够仅通过写

render :json => @person 
+0

人有什么关联? – Sash 2013-12-19 13:27:54

+1

这个答案只适用于Rails项目。香草红宝石怎么样? – cevaris 2014-10-19 01:20:17

+1

我会说它甚至不适用于Rails ..它只适用于轨道应用程序内的控制器..范围非常有限。 – baash05 2015-05-07 07:55:59

19

是的,你可以做到这一点与to_json,以节省时间。如果你不运行Rails,你可能需要require 'json'

+1

对于Rails,没有必要使用'require'json'',但是对于普通的Ruby代码来说,它可能是必需的。 [JSON是Ruby标准库的一部分](https://ruby-doc.org/stdlib/libdoc/json/rdoc/index.html),所以它带有语言。 – 2017-05-17 21:00:15

10

为了让您的Ruby类JSON友好而不触及Rails的,您可以定义两种方法:

  • 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" 
           # } 
           # } 

另请参阅“Using custom to_json method in nested objects”。