如何在Rails中自定义JSON输出? [英] How to customize json output in rails?
问题描述
我有一个语言模型,我想将所有语言都获取为json,但json输出如下所示
I have a model for languages and i want to get all the languages as json but the json output looks as follows
[{"language":{"created_at":null,"id":1,"language":英语","updated_at":null}},{"language":{"created_at":null, "id":2,"language":瑞典","updated_at":null}},{"language":{"created_at":null,"id":3,"language":德语","updated_at :null}},{" language:{" created_at:null," id:4," language:"法语," updated_at:null}},{" language:{" created_at: null,"id":5,"language":西班牙语","updated_at":null}},{"language":{"created_at":null,"id":6,"language":"dutch", "updated_at":null}},{"language":{"created_at":"2012-12-03T05:01:18Z","id":7,"language":"Tamil","updated_at":"2012 -12-03T05:01:18Z}}]
[{"language":{"created_at":null,"id":1,"language":"English","updated_at":null}},{"language":{"created_at":null,"id":2,"language":"Swedish","updated_at":null}},{"language":{"created_at":null,"id":3,"language":"German","updated_at":null}},{"language":{"created_at":null,"id":4,"language":"French","updated_at":null}},{"language":{"created_at":null,"id":5,"language":"spanish","updated_at":null}},{"language":{"created_at":null,"id":6,"language":"dutch","updated_at":null}},{"language":{"created_at":"2012-12-03T05:01:18Z","id":7,"language":"Tamil","updated_at":"2012-12-03T05:01:18Z"}}]
但是我想把它做成
{"language":[{"created_at":null,"id":1,"language":英语","updated_at":null},{"created_at":null,"id":2, "language":瑞典","updated_at":null},{"created_at":null,"id":3,"language":德语","updated_at":null},{"created_at":null, "id":4,"language":法语","updated_at":null},{"created_at":null,"id":5,"language":西班牙语","updated_at":null},{ "created_at":null,"id":6,"language":"dutch","updated_at":null},{"created_at":null,"id":7,"language":"Tamil","updated_at :null}]}
{"language":[{"created_at":null,"id":1,"language":"English","updated_at":null},{"created_at":null,"id":2,"language":"Swedish","updated_at":null},{"created_at":null,"id":3,"language":"German","updated_at":null},{"created_at":null,"id":4,"language":"French","updated_at":null},{"created_at":null,"id":5,"language":"spanish","updated_at":null},{"created_at":null,"id":6,"language":"dutch","updated_at":null},{"created_at":null,"id":7,"language":"Tamil","updated_at":null} ] }
更新
def index
@languages = Language.all
respond_to do |format|
format.json { render json: @languages}
end
end
更新2
class Language < ActiveRecord::Base
ActiveRecord::Base.include_root_in_json = false
has_and_belongs_to_many :users
end
推荐答案
我认为这应该可行:
format.json { render json: { "language" => @languages.as_json(:root => false) }.to_json }
将@languages
数组转换为不具有根键的JSON格式哈希模型数组的操作(使用as_json
),然后将结果包装在具有根键"language"的哈希中,并且使用to_json
将该哈希值转换为JSON格式的字符串. (有关包含或包含的详细信息,请参见文档不包括使用as_json
的根节点.)
What this does it to convert the @languages
array into an array of JSON-formatted hash models with no root keys (using as_json
), then wraps the result in a hash with a root key "language", and convert that hash into a JSON-formatted string with to_json
. (See the docs for details on including or not including a root node using 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\"}]}"
这篇关于如何在Rails中自定义JSON输出?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!