如何将Ruby对象转换为JSON
我想做这样的事情:
require 'json' class Person attr_accessor :fname, :lname end p = Person.new p.fname = "Mike" p.lname = "Smith" p.to_json
可能吗?
是的,你可以用to_json
。
如果你没有运行Rails,你可能需要require 'json'
。
试试吧。 如果你正在使用Ruby on Rails(并且标签说你是),我认为这个确切的代码应该已经可以工作,而不需要任何东西。
Rails支持来自控制器的JSON输出,因此它已经提取了您将需要的所有JSON序列化代码。 如果您计划通过控制器输出此数据,则可以通过编写来节省时间
render :json => @person
要在不触及Rails的情况下使Ruby类具有JSON友好性,您需要定义两种方法:
-
to_json
,返回一个JSON对象 -
as_json
,返回对象的哈希表示
当你的对象对to_json
和as_json
都做出正确的响应时,即使它嵌套在其他标准类(如Array和/或Hash)的as_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方法 ”。