How can I "pretty" format my JSON output in Ruby on Rails?
I would like my JSON output in Ruby on Rails to be "pretty" or nicely formatted.
 Right now, I call to_json and my JSON is all on one line.  At times this can be difficult to see if there is a problem in the JSON output stream.  
Is there way to configure or a method to make my JSON "pretty" or nicely formatted in Rails?
 Use the pretty_generate() function, built into later versions of JSON.  For example:  
require 'json'
my_object = { :array => [1, 2, 3, { :sample => "hash"} ], :foo => "bar" }
puts JSON.pretty_generate(my_object)
Which gets you:
{
  "array": [
    1,
    2,
    3,
    {
      "sample": "hash"
    }
  ],
  "foo": "bar"
}
 Thanks to Rack Middleware and Rails 3 you can output pretty JSON for every request without changing any controller of your app.  I have written such middleware snippet and I get nicely printed JSON in browser and curl output.  
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
 The above code should be placed in app/middleware/pretty_json_response.rb of your Rails project.  And the final step is to register the middleware in config/environments/development.rb :  
config.middleware.use PrettyJsonResponse
 I don't recommend to use it in production.rb .  The JSON reparsing may degrade response time and throughput of your production app.  Eventually extra logic such as 'X-Pretty-Json: true' header may be introduced to trigger formatting for manual curl requests on demand.  
(Tested with Rails 3.2.8-5.0.0, Ruby 1.9.3-2.2.0, Linux)
 The <pre> tag in HTML, used with JSON.pretty_generate , will render the JSON pretty in your view.  I was so happy when my illustrious boss showed me this:  
<% if !@data.blank? %>
   <pre><%= JSON.pretty_generate(@data) %></pre>
<% end %>
上一篇: 使用grep
