关于ruby on rails:ActiveRecord:生成多行人性化的json

ActiveRecord: Produce multi-line human-friendly json

使用activeRecord::base.to_json i do:

1
2
3
user = User.find_by_name 'Mika'

{"created_at":"2011-07-10T11:30:49+03:00","id":5,"is_deleted":null,"name":"Mika"}

现在,我想要的是:

1
2
3
4
5
6
{
   "created_at":"2011-07-10T11:30:49+03:00",
   "id":5,
   "is_deleted":null,
   "name":"Mika"
}

有选择吗?

拥有一个全局选项是很好的,这样行为就可以根据开发人员/实时环境进行设置。


我要冒险说"不,没有这样的选择"。

实际上,JSON编码是由ActiveSupport处理的,而不是ActiveRecord。如果您在activesupport gem中查看lib/active_support/json/encoding.rb,您会看到许多monkey补丁正在将as_jsonencode_json方法添加到一些核心类中;as_json方法只是用于将时间、regexp等内容扁平化为字符串等简单类型。有趣的monkey补丁是encode_json补丁,这些方法正在做生成json的真正工作,它们中没有任何东西可以控制最终的输出格式;例如,hash版本就是这样的:

1
2
3
4
# 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只是将它们混合在一个紧凑的字符串中,没有选择来实现漂亮。

在JSonification期间,所有复杂的类看起来都是散列或数组,因此理论上,您可以将自己的monkey补丁添加到散列和数组中,以使它们产生漂亮的效果。但是,您可能在跟踪结构的深度时遇到一些困难,因此无法生成:

1
2
3
4
5
6
7
8
9
10
{
   "created_at":"2011-07-10T11:30:49+03:00",
   "id":5,
   "is_deleted":null,
   "name":"Mika"
   "nested":{
   "not":"so pretty now",
   "is":"it"
}
}

会很直接,但是:

1
2
3
4
5
6
7
8
9
10
{
   "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的交互,那么火狐的JSONovich扩展可能就不那么麻烦了。jsonovich有一些好的特性(比如扩展和折叠嵌套结构),这些特性也超越了简单、漂亮的打印。

顺便说一句,我查看了Rails 3.0和3.1,如果您感兴趣,可以查看Rails 2。


你考虑过JSON宝石吗?我相信这正是你想要的。

例如

1
JSON.pretty_generate(user)

看看这里的细节…

http://apidock.com/ruby/json/pretty_生成