mik*_*tes 4 ruby activerecord json ruby-on-rails
使用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"}
Run Code Online (Sandbox Code Playgroud)
现在,我想拥有的是:
{
"created_at":"2011-07-10T11:30:49+03:00",
"id":5,
"is_deleted":null,
"name":"Mika"
}
Run Code Online (Sandbox Code Playgroud)
有没有选择这样做?
拥有一个全局选项会很棒,因此可以根据开发/实时环境设置行为.
我会站出来说"不,没有这样的选择".
AFAIK,JSON编码实际上是由ActiveSupport而不是ActiveRecord处理的.如果你看看lib/active_support/json/encoding.rb你的ActiveSupport gem,你会看到很多猴子补丁继续添加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
Run Code Online (Sandbox Code Playgroud)
在encoder刚刚处理之类的Unicode和报价逃逸.正如你所看到的,encode_json它只是在一个紧凑的字符串中将它们混合在一起,没有任何选项可以实现美观.
在JSONification期间,所有复杂的类似乎都归结为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"
}
}
Run Code Online (Sandbox Code Playgroud)
会很直接但是这个:
{
"created_at":"2011-07-10T11:30:49+03:00",
"id":5,
"is_deleted":null,
"name":"Mika"
"nested": {
"not":"so pretty now",
"is":"it"
}
}
Run Code Online (Sandbox Code Playgroud)
会更难,而且大概是你想要后者,特别是深度嵌套的JSON,其中眼球结构很难.你可能能够encoder在传递的状态上挂起一点状态,但这会变得有点丑陋和脆弱.
一个更可行的选项是输出过滤器,用于在将JSON发送到浏览器之前对其进行解析和重新格式化.你必须借用或制造漂亮的打印机,但这不应该那么困难.您应该能够有条件地为您的开发环境附加所述过滤器,而不会有太多的丑陋.
如果您只是想调试基于JSON的交互,那么Firefox 的JSONovich扩展可能不会那么麻烦.JSONovich有一些不错的功能(例如扩展和折叠嵌套结构),它们不仅仅是简单的漂亮打印.
顺便说一下,我为此审查了Rails 3.0和3.1,如果你有兴趣可以查看Rails 2.
| 归档时间: |
|
| 查看次数: |
1433 次 |
| 最近记录: |