使用JSON序列化(和反序列化)'复杂'Rails对象

时间:2010-11-13 01:13:33

标签: ruby-on-rails json serialization

可能是一个愚蠢的问题,但我对Rails相对较新,并想知道Rails如何处理序列化另一个类的has_many(和/或belongs_to)对象的模型。它会默认序列化整个对象图吗?你一定想要吗?你能控制一下吗?怎么样?

接收端有关如何对其进行反序列化的任何技巧?或几乎蛮力为其哈希值分配属性,然后任何嵌入的数组/哈希将成为关联的类对象?

编辑:添加使用@ zetetic示例返回的json示例。想知道为什么嵌入式集合(索环)在每个引用(\)之前都有转义(")字符?

{"name":"Gizmo","height":15,"grommets":"[{\"name\":\"Sid\",\"color\":\"yellow\"},{\"name\":\"Elvis\",\"color\":\"\"},{\"name\":\"Teeny\",\"color\":\"Red\"}

2 个答案:

答案 0 :(得分:3)

不,默认情况下,序列化模型实例仅发出自己的属性,而不是其关联的属性。但您可以通过在模型中包含as_json方法来自定义此行为:

class MyModel < ActiveRecord::Base
  has_many :widgets

  def as_json(options={})
    {
      :name => name,
      :widgets => widgets.to_json
    }
  end
end

您可能也想在相关模型中定义as_json,否则您将获得属性的标准哈希值。

修改

原来上面的示例仅适用于顶级,而不适用于最终转义的关联。要使示例正常工作,请在as_json中使用所需属性定义Widget,然后在MyModel调用as_json集合的每个元素上定义:{/ p>

def as_json(options={})
  {
    :name => name,
    :widgets => widgets.map(&:as_json)
  }
end

我猜你可以monkeypatch Array#as_json,虽然我更喜欢使用map

修改

如果您正在考虑提出这个答案,请务必先阅读this one。使用:include是首选方法。

答案 1 :(得分:1)

轻松! (在Rails 2.3.8上测试)

来自http://apidock.com/rails/ActiveRecord/Serialization/to_json

要包含关联,请使用:include

    konata.to_json(:include => :posts)
  # => {"id": 1, "name": "Konata Izumi", "age": 16,
        "created_at": "2006/08/01", "awesome": true,
        "posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
                  {"id": 2, author_id: 1, "title": "So I was thinking"}]}

请参阅上面的链接了解更多信息。

对我来说,它甚至可以使用“:has_many,:through”关联。