13

我的 Rails 应用程序中有一个 JSON 数组,使用 Active Model Serializer 以这种格式:

[
  {
    "contact" : {}
  },
  {
    "contact" : {}
  }
]

如何做到这一点,以便我删除联系人上方的一级节点使用活动模型序列化程序,如下所示:

[
 {
 },
 {
 }
]

我还想删除节点名称“联系人”。

4

4 回答 4

25

这在RailsCast #409 Active Model Serializers中有介绍。

为了删除根节点,您可以在控制器中添加root: false对的调用。render假设您contact在 JSON 中的 s 来自一个contacts#index方法,您的代码可能类似于:

def index
  @contacts = Contacts.all
  respond_to do |format|
    format.html
    format.json { render json: @contacts, root: false }
  end
end

或者,如果您不想要任何 JSON 中的任何根节点,请在 中ApplicationController添加以下方法:

def default_serializer_options
  {root: false}
end
于 2013-03-12T02:57:33.133 回答
15

对于使用 ActiveModel::Serializer v0.10.x 的人,您需要创建一个初始化程序并包括以下内容:

# config/initializers/serializer.rb
ActiveModelSerializers.config.adapter = :json
ActiveModelSerializers.config.json_include_toplevel_object = true

然后,只需重新启动您的应用程序,您应该会获得所需的根对象。

这适用于 Rails 5.1.x。YMMV。HTH。

于 2017-08-29T23:37:19.510 回答
5

如果我没记错的话,通常根节点默认具有您的控制器的名称。

format.json { render json: @contacts}

当然你需要删除root false,它会删除节点的名称。

如果您希望联系人作为根对象,请使用以下命令:

format.json { render json :@contacts, :root => 'contact' }
于 2013-03-17T11:21:51.240 回答
5

/config/initializers/serializer.rb

ActiveModelSerializers.config.adapter = :json_api # Default: `:attributes`

默认情况下,ActiveModelSerializers 将使用属性适配器(无 JSON 根)。但我们强烈建议您使用 JsonApi Adapter,它遵循jsonapi.org/format 中指定的格式的1.0

于 2016-11-16T13:16:09.913 回答