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?

19voto

Phrogz Punkte 283167

Wenn Sie feststellen, dass die pretty_generate Option in Rubys JSON-Bibliothek nicht "hübsch" genug ist, empfehle ich meine eigene NeatJSON gem für Ihre Formatierung.

Zur Verwendung:

gem install neatjson

und verwenden Sie dann

JSON.neat_generate

anstelle von

JSON.pretty_generate

Wie Ruby's pp werden Objekte und Arrays in einer Zeile gehalten, wenn sie passen, aber bei Bedarf in mehrere Zeilen umgebrochen. Zum Beispiel:

{
  "navigation.createroute.poi":[
    {"text":"Lay in a course to the Hilton","params":{"poi":"Hilton"}},
    {"text":"Take me to the airport","params":{"poi":"airport"}},
    {"text":"Let's go to IHOP","params":{"poi":"IHOP"}},
    {"text":"Show me how to get to The Med","params":{"poi":"The Med"}},
    {"text":"Create a route to Arby's","params":{"poi":"Arby's"}},
    {
      "text":"Go to the Hilton by the Airport",
      "params":{"poi":"Hilton","location":"Airport"}
    },
    {
      "text":"Take me to the Fry's in Fresno",
      "params":{"poi":"Fry's","location":"Fresno"}
    }
  ],
  "navigation.eta":[
    {"text":"When will we get there?"},
    {"text":"When will I arrive?"},
    {"text":"What time will I get to the destination?"},
    {"text":"What time will I reach the destination?"},
    {"text":"What time will it be when I arrive?"}
  ]
}

Außerdem unterstützt es eine Vielzahl von Formatierungsoptionen um Ihre Ausgabe weiter anzupassen. Zum Beispiel, wie viele Leerzeichen vor/nach Doppelpunkten? Vor/nach Kommas? Innerhalb der Klammern von Arrays und Objekten? Möchten Sie die Schlüssel Ihres Objekts sortieren? Sollen die Doppelpunkte alle aneinander gereiht werden?

19voto

oj5th Punkte 1307

Verwendung von <pre> HTML-Code und pretty_generate ist ein guter Trick:

<%
  require 'json'

  hash = JSON[{hey: "test", num: [{one: 1, two: 2, threes: [{three: 3, tthree: 33}]}]}.to_json] 
%>

<pre>
  <%=  JSON.pretty_generate(hash) %>
</pre>

17voto

Thomas Klemm Punkte 10370

Dumping eines ActiveRecord-Objekts in JSON (in der Rails-Konsole):

pp User.first.as_json

# => {
 "id" => 1,
 "first_name" => "Polar",
 "last_name" => "Bear"
}

9voto

Wayne Conrad Punkte 95828

Hier ist eine Middleware-Lösung, die von diese ausgezeichnete Antwort von @gertas . Diese Lösung ist nicht Rails-spezifisch - sie sollte mit jeder Rack-Anwendung funktionieren.

Die hier verwendete Middleware-Technik, die #each verwendet, wird erklärt unter ASCIIcasts 151: Rack-Middleware von Eifion Bedford.

Dieser Code wird in app/middleware/pretty_json_response.rb :

class PrettyJsonResponse

  def initialize(app)
    @app = app
  end

  def call(env)
    @status, @headers, @response = @app.call(env)
    [@status, @headers, self]
  end

  def each(&block)
    @response.each do |body|
      if @headers["Content-Type"] =~ /^application\/json/
        body = pretty_print(body)
      end
      block.call(body)
    end
  end

  private

  def pretty_print(json)
    obj = JSON.parse(json)  
    JSON.pretty_unparse(obj)
  end

end

Um dies zu aktivieren, fügen Sie dies zu config/environments/test.rb und config/environments/development.rb hinzu:

config.middleware.use "PrettyJsonResponse"

Wie @gertas in seiner Version dieser Lösung warnt, sollten Sie diese Lösung nicht in der Produktion verwenden. Sie ist etwas langsam.

Getestet mit Rails 4.1.6.

7voto

#At Controller
def branch
    @data = Model.all
    render json: JSON.pretty_generate(@data.as_json)
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