【发布时间】:2011-03-14 15:41:23
【问题描述】:
我想做这样的事情:
require 'json'
class Person
attr_accessor :fname, :lname
end
p = Person.new
p.fname = "Mike"
p.lname = "Smith"
p.to_json
有可能吗?
【问题讨论】:
标签: 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
有可能吗?
【问题讨论】:
标签: ruby-on-rails ruby json
是的,您可以使用to_json。
如果你没有运行 Rails,你可能需要require 'json'。
【讨论】:
require 'json',但是对于常规的 Ruby 代码,它可能是必要的。 JSON is part of Ruby's Standard Library 所以它带有语言。
为了让您的 Ruby 类在不接触 Rails 的情况下对 JSON 友好,您需要定义两种方法:
to_json,返回一个 JSON 对象as_json,返回对象的哈希表示当您的对象正确响应 to_json 和 as_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"
# }
# }
【讨论】:
试试看。如果您使用的是 Ruby on Rails(并且标签上说您是),我认为这个确切的代码应该已经可以工作了,不需要任何东西。
Rails 支持来自控制器的 JSON 输出,因此它已经引入了您将需要的所有 JSON 序列化代码。如果您打算通过控制器输出此数据,则只需编写即可节省时间
render :json => @person
【讨论】: