9

我对 Ruby 数组和哈希操作非常陌生。

我该如何做这个简单的转换?

array = [#<struct id=1, car='red'>, #<struct id=2, car='yellow'>, #<struct id=3, car='green'>]

所需的 json 输出:

[{id : 1, car : 'red'} , {id:2, car :'yellow'} ,{id:3 , car: "green"}]

有没有人有任何提示?

4

3 回答 3

16
array.map { |o| Hash[o.each_pair.to_a] }.to_json
于 2012-05-31T08:02:58.560 回答
7

struct对象数组转换为 数组hash,然后调用to_json. 您需要 require json(ruby 1.9) 才能使用该to_json方法。

array.collect { |item| {:id => item.id, :car => item.car} }.to_json
于 2012-05-31T08:01:11.260 回答
2

默认情况下,当使用 json ruby​​ gem 编码为 json 时,Struct 实例将显示为字符串:

require 'json'
array = [#<struct id=1, car='red'>, #<struct id=2, car='yellow'>, #<struct id=3, car='green'>] # assuming real structure code in the array
puts array.to_json

印刷

["#<struct id=1, car='red'>", "#<struct id=2, car='yellow'>", "#<struct id=3, car='green'>"]

这显然不是你想要的。

下一个合乎逻辑的步骤是确保您的结构实例可以正确序列化为 JSON,以及从 JSON 中创建回来。

为此,您可以更改结构的声明:

YourStruct = Struct.new(:id, :car)
class YourStruct
  def to_json(*a)
    {:id => self.id, :car => self.car}.to_json(*a)
  end

  def self.json_create(o)
    new(o['id'], o['car'])
  end
end

因此,您现在可以编写以下内容:

a = [ YourStruct.new(1, 'toy'), YourStruct.new(2, 'test')]
puts a.to_json

哪个打印

[{"id": 1,"car":"toy"},{"id": 2,"car":"test"}]

并从 JSON 反序列化:

YourStruct.json_create(JSON.parse('{"id": 1,"car":"toy"}'))
# => #<struct YourStruct id=1, car="toy">
于 2012-05-31T08:10:38.307 回答