如何将 Ruby 对象转换为 JSON
Posted
技术标签:
【中文标题】如何将 Ruby 对象转换为 JSON【英文标题】:How to convert a Ruby object to JSON 【发布时间】: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
有可能吗?
【问题讨论】:
【参考方案1】:是的,您可以使用to_json
。
如果你没有运行 Rails,你可能需要require 'json'
。
【讨论】:
在 Rails 中,没有必要使用require 'json'
,但是对于常规的 Ruby 代码,它可能是必要的。 JSON is part of Ruby's Standard Library 所以它带有语言。【参考方案2】:
为了让您的 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"
#
#
另见“Using custom to_json method in nested objects”。
【讨论】:
【参考方案3】:试试看。如果您使用的是 Ruby on Rails(并且标签上说您是),我认为这个确切的代码应该已经可以工作了,不需要任何东西。
Rails 支持来自控制器的 JSON 输出,因此它已经引入了您将需要的所有 JSON 序列化代码。如果您打算通过控制器输出此数据,则只需编写即可节省时间
render :json => @person
【讨论】:
什么是人有关联? 此答案仅适用于 Rails 项目。香草红宝石怎么样? 我想说它甚至不适用于 Rails.. 它只适用于 Rails 应用程序内的控制器.. 范围非常有限。以上是关于如何将 Ruby 对象转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章