ActiveRecord:生成多个
使用ActiveRecord :: Base.to_json我这样做:
user = User.find_by_name 'Mika'
{"created_at":"2011-07-10T11:30:49+03:00","id":5,"is_deleted":null,"name":"Mika"}
现在,我想要的是:
{
"created_at":"2011-07-10T11:30:49+03:00",
"id":5,
"is_deleted":null,
"name":"Mika"
}
有没有这样做的选择?
拥有一个全局选项是非常好的,这样就可以根据dev / live环境设置行为。
我会肢体而出,说“不,没有这样的选择”。
AFAIK,JSON编码实际上是由ActiveSupport而不是ActiveRecord处理的。 如果您查看ActiveSupport gem的lib/active_support/json/encoding.rb
,您会看到许多猴子补丁正在将as_json
和encode_json
方法添加到某些核心类中; as_json
方法只是用来将诸如Time,Regexp等的东西扁平化为更简单的类型,比如String。 有趣的猴子补丁是encode_json
补丁,这些方法正在完成生成JSON的真正工作,并且它们没有任何内容用于控制最终的输出格式; 例如,哈希版本就是这样的:
# comments removed for clarity
def encode_json(encoder)
"{#{map { |k,v| "#{encoder.encode(k.to_s)}:#{encoder.encode(v, false)}" } * ','}}"
end
encoder
只处理Unicode之类的东西并引用转义。 正如你所看到的, encode_json
只是将它们全部混合成一个紧凑的字符串,并且没有选择来启用可爱。
在JSON化过程中,所有复杂的类似乎归结为Hash或Array,因此理论上可以将自己的猴子补丁添加到Hash和Array中,以使它们产生漂亮的东西。 然而,你可能会遇到一些麻烦,记录下你的结构有多深:
{
"created_at":"2011-07-10T11:30:49+03:00",
"id":5,
"is_deleted":null,
"name":"Mika"
"nested":{
"not":"so pretty now",
"is":"it"
}
}
将是非常简单的,但这个:
{
"created_at":"2011-07-10T11:30:49+03:00",
"id":5,
"is_deleted":null,
"name":"Mika"
"nested": {
"not":"so pretty now",
"is":"it"
}
}
会更困难,大概你会想要后者,特别是对于深度嵌套的JSON来说,这种结构的目测很难。 你可能会在encoder
上挂上一些状态,但这会变得有点丑陋和脆弱。
一个更可行的选项是一个输出过滤器,在将它发送到浏览器之前解析并重新格式化JSON。 你不得不借用或建造漂亮的打印机,但这不应该那么困难。 您应该能够有条件地将所述过滤器仅用于您的开发环境,同时不会有太多的丑陋。
如果你只是想调试基于JSON的交互,那么也许Firefox的JSONovich扩展将不那么麻烦。 JSONovich有一些不错的功能(比如展开和折叠嵌套结构),它们超越了简单的漂亮打印。
顺便说一下,我为此回顾了Rails 3.0和3.1,如果您有兴趣,可以查看Rails 2。
你有没有考虑过JSON宝石? 我相信它完全符合你的要求。
例如
JSON.pretty_generate(user)
看看这里的细节...
http://apidock.com/ruby/JSON/pretty_generate
链接地址: http://www.djcxy.com/p/47155.html