297 votos

¿Cómo puedo formatear mi salida JSON en Ruby on Rails?

Me gustaría que mi salida de JSON en Ruby on Rails sea "bonita" o con un buen formato. Ahora mismo, llamo al to_json y mi JSON está en una sola línea. A veces esto puede ser difícil de ver si hay un problema en el flujo de salida de JSON.

¿Hay alguna forma de configurar o un método para hacer que mi JSON sea "bonito" o esté bien formateado en RoR?

503voto

jpatokal Puntos 6061

Use el pretty_generate() incorporada en versiones posteriores de JSON. Por ejemplo:

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

Lo cual te atrapa:

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

48voto

gertas Puntos 7113

Gracias a Rack Middleware y Rails 3 puedes producir un bonito JSON para cada petición sin cambiar ningún controlador de tu aplicación. He escrito este fragmento de middleware y consigo un JSON bien impreso en el navegador y curl salida.

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"] = Rack::Utils.bytesize(pretty_str).to_s
    end
    [status, headers, response]
  end
end

El código anterior debe colocarse en app/middleware/pretty_json_response.rb de su proyecto de Rails. Y el paso final es registrar el middleware en config/environments/development.rb :

config.middleware.use PrettyJsonResponse

No recomiendo usarlo en production.rb . La reparación de JSON puede degradar el tiempo de respuesta y el rendimiento de su aplicación de producción. Eventualmente se puede introducir una lógica extra como el encabezado "X-Pretty-Json: true" para activar el formato de las solicitudes de rizos manuales a pedido.

(Probado con Rails 3.2.8-4.0.2, Ruby 1.9.3-2.1.0, Linux)

28voto

Roger Garza Puntos 281

El <pre> en HTML, usado con JSON.pretty_generate hará que el JSON sea bonito a su vista. Estaba tan feliz cuando mi ilustre jefe me mostró esto:

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

16voto

Ed Lebert Puntos 106

Si quieres:

  1. Bonita todas las respuestas salientes de JSON de tu aplicación automáticamente.
  2. Evitar contaminar Objeto#a_json/#as_json
  3. Evitar el análisis y la reproducción de JSON utilizando el middleware (YUCK!)
  4. ¡Hazlo por el camino de los rieles!

Entonces... reemplace el Controlador de Acción::Renderizador para JSON! Sólo tienes que añadir el siguiente código a tu ApplicationController:

ActionController::Renderers.add :json do |json, options|
  unless json.kind_of?(String)
    json = json.as_json(options) if json.respond_to?(:as_json)
    json = JSON.pretty_generate(json, options)
  end

  if options[:callback].present?
    self.content_type ||= Mime::JS
    "#{options[:callback]}(#{json})"
  else
    self.content_type ||= Mime::JSON
    json
  end
end

1voto

Tony Puntos 2886

He usado la gema CodeRay y funciona bastante bien. El formato incluye colores y reconoce muchos formatos diferentes.

Lo he usado en una gema que puede ser usada para depurar APIs de Rails y funciona bastante bien.

Por cierto, la gema se llama 'api_explorer' ( http://www.github.com/toptierlabs/api_explorer )

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X