ActiveRecord:生成多线人性化的json

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)

有没有选择这样做?

拥有一个全局选项会很棒,因此可以根据开发/实时环境设置行为.

mu *_*ort 6

我会站出来说"不,没有这样的选择".

AFAIK,JSON编码实际上是由ActiveSupport而不是ActiveRecord处理的.如果你看看lib/active_support/json/encoding.rb你的ActiveSupport gem,你会看到很多猴子补丁继续添加as_jsonencode_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.