将类的Ruby数组转换为JSON
我有一个Ruby数据结构:
class Albums attr_accessor :title, :url def initialize(title, url) @title = title @url = url end end class Albumlist < Albums attr_accessor :id, :albums def initialize(id) @id = id @albums = Array.new end end
我制作了一个Albumlist数组,看起来像(使用.inspect方法):
[#<Albumlist:0x8db6390 @id="abc",@albums=[ #, # ]>, #<Albumlist:0x8f4042c @id="def", @albums=[ # ]> ]
我不确定这个数组是否正常但是一旦我在这个数组上使用了.to_json或JSON.generate()方法,我得到的只有:
["#","#"]
看起来Ruby返回对象实例的“引用”。 我想用JSON转换这个数组,看起来应该是这样的
[ { "id":"abc" "albums":[ { "title":"123", "url":"test" }, { "title":"456", "url":"test" } ] }, { "id":"def" "albums":[ { "title":"Untitled Album", "url":"test" } ] } ]
而且我相信我遗漏了一些东西,例如将数组转换成某种中间对象?
编辑:替代解决方案
在类Albumlist中定义一个to_json方法,如下所示:
def to_json(*a) { "id" => @id, "albums" => @albums }.to_json(*a) end
并用它代替..
这里有效,可能你没有在正确的时刻应用这个方法,让我们尝试一下,首先,关注数组,如下所示:
require 'rubygems' require 'active_support/all' class Albums attr_accessor :title, :url def initialize(title, url) @title = title @url = url end end class Albumlist < Albums attr_accessor :id, :albums def initialize(id) @id = id @albums = Array.new end end a = Albums.new("a", "www.a.com") b = Albums.new("b", "www.b.com") c = Albums.new("c", "www.c.com") list_of_albums_list = Array.new list_a = Albumlist.new(1) list_b = Albumlist.new(2) list_a.albums << a list_a.albums << b list_b.albums << c list_of_albums_list << list_a list_of_albums_list << list_b puts list_of_albums_list.to_json
输出是:
[{"albums":[{"title":"a","url":"www.a.com"},{"title":"b","url":"www.b.com"}],"id":1},{"albums":[{"title":"c","url":"www.c.com"}],"id":2}]
因此该方法按预期工作。