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_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

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

上一篇: ActiveRecord: Produce multi

下一篇: How do you create pretty json in CHEF (ruby)