758 Stimmen

Wie man JSON-Ausgaben in Ruby on Rails "hübsch" formatiert

Ich möchte, dass meine JSON-Ausgabe in Ruby on Rails "hübsch" oder schön formatiert ist.

Im Moment rufe ich to_json und mein JSON steht in einer einzigen Zeile. Manchmal kann dies schwierig sein, zu sehen, wenn es ein Problem in der JSON-Ausgabe-Stream ist.

Gibt es eine Möglichkeit zu konfigurieren, um meine JSON "hübsch" oder schön formatiert in Rails zu machen?

1163voto

lambshaanxy Punkte 21602

Verwenden Sie die pretty_generate() Funktion, die in späteren Versionen von JSON enthalten ist. Zum Beispiel:

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

Das bringt Sie weiter:

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

113voto

Roger Garza Punkte 1303

Le site <pre> Tag in HTML, verwendet mit JSON.pretty_generate wird das JSON in Ihrer Ansicht hübsch dargestellt. Ich war so glücklich, als mein illustrer Chef mir das zeigte:

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

82voto

gertas Punkte 16291

Dank Rack Middleware und Rails 3 können Sie für jede Anfrage hübsches JSON ausgeben, ohne einen Controller Ihrer Anwendung zu ändern. Ich habe ein solches Middleware-Snippet geschrieben und ich erhalte schön gedrucktes JSON im Browser und curl Ausgabe.

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

Der obige Code sollte in app/middleware/pretty_json_response.rb Ihres Rails-Projekts. Und der letzte Schritt ist die Registrierung der Middleware in config/environments/development.rb :

config.middleware.use PrettyJsonResponse

Ich empfehle nicht, es zu verwenden in production.rb . Das JSON-Reparsing kann die Reaktionszeit und den Durchsatz Ihrer Produktionsanwendung beeinträchtigen. Eventuell kann eine zusätzliche Logik wie der Header "X-Pretty-Json: true" eingeführt werden, um die Formatierung für manuelle Curl-Anfragen bei Bedarf auszulösen.

(Getestet mit Rails 3.2.8-5.0.0, Ruby 1.9.3-2.2.0, Linux)

27voto

Synthead Punkte 1977

Überprüfen Sie Toller Druck . Parsen Sie die JSON-Zeichenfolge in einen Ruby-Hash und zeigen Sie sie dann mit ap etwa so:

require "awesome_print"
require "json"

json = '{"holy": ["nested", "json"], "batman!": {"a": 1, "b": 2}}'

ap(JSON.parse(json))

Mit den oben genannten Informationen werden Sie sehen:

{
  "holy" => [
    [0] "nested",
    [1] "json"
  ],
  "batman!" => {
    "a" => 1,
    "b" => 2
  }
}

Awesome Print fügt auch etwas Farbe hinzu, die Ihnen Stack Overflow nicht zeigen wird.

26voto

Ed Lebert Punkte 421

Wenn Sie das wollen:

  1. Alle von Ihrer Anwendung ausgehenden JSON-Antworten werden automatisch aufgehübscht.
  2. Vermeiden Sie die Verschmutzung von Object#to_json/#as_json
  3. Vermeiden Sie das Parsen/Re-Rendering von JSON mit Middleware (Igitt!)
  4. Machen Sie es auf die RAILS WAY!

Dann ... ersetzen Sie den ActionController::Renderer für JSON! Fügen Sie einfach den folgenden Code zu Ihrem ApplicationController hinzu:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X