协慌网

登录 贡献 社区

如何在 Ruby on Rails 中 “漂亮” 格式化 JSON 输出

我希望 Ruby on Rails 中的 JSON 输出是 “漂亮的” 或格式正确的。

现在,我调用to_json而我的 JSON 都在一行上。有时,很难看出 JSON 输出流中是否存在问题。

有没有办法配置使我的 JSON“漂亮” 或在 Rails 中很好地格式化?

答案

使用内置在更高版本的 JSON 中pretty_generate()例如:

require 'json'
my_object = { :array => [1, 2, 3, { :sample => "hash"} ], :foo => "bar" }
puts JSON.pretty_generate(my_object)

这使您:

{
  "array": [
    1,
    2,
    3,
    {
      "sample": "hash"
    }
  ],
  "foo": "bar"
}

JSON.pretty_generate使用的 HTML 中的<pre>标记将在您的视图中呈现 JSON。当我杰出的老板向我展示这一点时,我感到非常高兴:

<% if @data.present? %>
   <pre><%= JSON.pretty_generate(@data) %></pre>
<% end %>

借助 Rack Middleware 和 Rails 3,您可以为每个请求输出漂亮的 JSON,而无需更改应用程序的任何控制器。我已经编写了这样的中间件代码片段,并且在浏览器和curl输出中得到了很好的打印 JSON。

class PrettyJsonResponse
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    if headers["Content-Type"] =~ /^application\/json/
      obj = JSON.parse(response.body)
      pretty_str = JSON.pretty_unparse(obj)
      response = [pretty_str]
      headers["Content-Length"] = pretty_str.bytesize.to_s
    end
    [status, headers, response]
  end
end

上面的代码应该放在 Rails 项目的app/middleware/pretty_json_response.rb最后一步是在config/environments/development.rb注册中间件:

config.middleware.use PrettyJsonResponse

我不建议在production.rb使用它。 JSON 重新解析可能会降低响应时间和生产应用程序的吞吐量。最终可能会引入额外的逻辑,例如 “X-Pretty-Json:true” 标头,以触发按需手动卷曲请求的格式化。

(已在 Rails 3.2.8-5.0.0,Ruby 1.9.3-2.2.0,Linux 上进行测试)