如何在rails中自定义json输出?

log*_*esh 2 json ruby-on-rails ruby-on-rails-3

我有一个语言模型,我希望将所有语言都作为json,但json输出如下所示

[{ "语言":{ "created_at":空, "ID":1, "语言": "英语", "的updated_at":空}},{ "语言":{ "created_at":空, "ID" 2, "语言": "瑞典", "的updated_at":空}},{ "语言":{ "created_at":空, "ID":3, "语言": "德国", "的updated_at":空}},{ "语言":{ "created_at":空, "ID":4, "语言": "法国", "的updated_at":空}},{ "语言":{ "created_at":空" ID ":5," 语言 ":" 西班牙语", "的updated_at":空}},{ "语言":{ "created_at":空, "ID":6, "语言": "荷兰人", "的updated_at" :空}},{ "语言":{ "created_at": "2012-12-03T05:01:18Z", "ID":7, "语言": "泰米尔语", "的updated_at":"2012-12- 03T05:01:18Z"}}]

但我想把它作为

{ "语言":[{ "created_at":空, "ID":1, "语言": "英语", "的updated_at":空},{ "created_at":空, "ID":2, "语言" : "瑞典", "的updated_at":空},{ "created_at":空, "ID":3, "语言": "德国", "的updated_at":空},{ "created_at":空, "ID" :4, "语言": "法国", "的updated_at":空},{ "created_at":空, "ID":5, "语言": "西班牙", "的updated_at":空},{ "created_at"日期null, "ID":6, "语言": "荷兰人", "的updated_at":空},{ "created_at":空, "ID":7, "语言": "泰米尔语", "的updated_at":空}]}

更新

def index
 @languages = Language.all
 respond_to do |format|
   format.json { render json: @languages}
 end
end
Run Code Online (Sandbox Code Playgroud)

更新2

    class Language < ActiveRecord::Base
        ActiveRecord::Base.include_root_in_json = false
        has_and_belongs_to_many :users 
    end
Run Code Online (Sandbox Code Playgroud)

Chr*_*erg 14

我相信这应该有效:

format.json { render json: { "language" => @languages.as_json(:root => false) }.to_json }
Run Code Online (Sandbox Code Playgroud)

这样做是为了将@languages数组转换为没有根密钥(使用as_json)的JSON格式散列模型数组,然后将结果包装在具有根密钥"language"的散列中,并将该散列转换为JSON格式的字符串与to_json.(有关包含或不包括使用的根节点的详细信息,请参阅文档as_json.)

例如,使用模型Post:

posts = Post.all
#=> [#<Post id: 1, name: "foo", title: "jkl", content: "some content", created_at: "2012-11-22 01:05:46", updated_at: "2012-11-22 01:05:46">]

# convert to array of hashes with no root keys
posts.as_json(root: false)
#=> [{"content"=>"some content", "created_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00, "id"=>1, "name"=>"foo", "title"=>"jkl", "updated_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00}]

# add root back to collection:
{ "post" => posts.as_json(root: false) }
#=> {"post"=>[{"content"=>"some content", "created_at"=>Thu, 22 Nov 2012 01:05:46 UTC +00:00, "id"=>1, "name"=>"foo", "title"=>"jkl", "updated_at"=>Mon, 03 Dec 2012 09:41:42 UTC +00:00}]}

# convert to JSON-formatted string
{ "post" => posts.as_json(root: false) }.to_json    
#=> "{\"post\":[{\"content\":\"some content\",\"created_at\":\"2012-11-22T01:05:46Z\",\"id\":1,\"name\":\"foo\",\"title\":\"jkl\",\"updated_at\":\"2012-12-03T09:43:37Z\"}]}"
Run Code Online (Sandbox Code Playgroud)