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?

3voto

Sergio Belevskij Punkte 2098
# example of use:
a_hash = {user_info: {type: "query_service", e_mail: "my@email.com", phone: "+79876543322"}, cars_makers: ["bmw", "mitsubishi"], car_models: [bmw: {model: "1er", year_mfc: 2006}, mitsubishi: {model: "pajero", year_mfc: 1997}]}
pretty_html = a_hash.pretty_html

# include this module to your libs:
module MyPrettyPrint
    def pretty_html indent = 0
        result = ""
        if self.class == Hash
            self.each do |key, value|
                result += "#{key}: #{[Array, Hash].include?(value.class) ? value.pretty_html(indent+1) : value}"
            end
        elsif self.class == Array
            result = "[#{self.join(', ')}]"
        end
        "#{result}"
    end

end

class Hash
    include MyPrettyPrint
end

class Array
    include MyPrettyPrint
end

3voto

Martin Carstens Punkte 636

Das einfachste Beispiel, das ich mir vorstellen kann:

my_json = '{ "name":"John", "age":30, "car":null }'
puts JSON.pretty_generate(JSON.parse(my_json))

Beispiel für die Rails-Konsole:

core dev 1555:0> my_json = '{ "name":"John", "age":30, "car":null }'
=> "{ \"name\":\"John\", \"age\":30, \"car\":null }"
core dev 1556:0> puts JSON.pretty_generate(JSON.parse(my_json))
{
  "name": "John",
  "age": 30,
  "car": null
}
=> nil

2voto

Jim Flood Punkte 7651

Wenn Sie Folgendes verwenden RABL können Sie es wie beschrieben konfigurieren aquí um JSON.pretty_generate zu verwenden:

class PrettyJson
  def self.dump(object)
    JSON.pretty_generate(object, {:indent => "  "})
  end
end

Rabl.configure do |config|
  ...
  config.json_engine = PrettyJson if Rails.env.development?
  ...
end

Ein Problem bei der Verwendung von JSON.pretty_generate ist, dass JSON-Schema-Validatoren nicht mehr mit Ihren Datetime-Strings zufrieden sind. Sie können diese in Ihrer config/initializers/rabl_config.rb mit beheben:

ActiveSupport::TimeWithZone.class_eval do
  alias_method :orig_to_s, :to_s
  def to_s(format = :default)
    format == :default ? iso8601 : orig_to_s(format)
  end
end

1voto

TheDadman Punkte 43

Ich verwende das folgende, da ich die Header, den Status und die JSON-Ausgabe als nützlich empfinde als Satz. Die Aufrufroutine ist auf Empfehlung aus einer Railscasts-Präsentation herausgebrochen bei: http://railscasts.com/episodes/151-rack-middleware?autoplay=true

  class LogJson

  def initialize(app)
    @app = app
  end

  def call(env)
    dup._call(env)
  end

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

  def each(&block)
    if @headers["Content-Type"] =~ /^application\/json/
      obj = JSON.parse(@response.body)
      pretty_str = JSON.pretty_unparse(obj)
      @headers["Content-Length"] = Rack::Utils.bytesize(pretty_str).to_s
      Rails.logger.info ("HTTP Headers:  #{ @headers } ")
      Rails.logger.info ("HTTP Status:  #{ @status } ")
      Rails.logger.info ("JSON Response:  #{ pretty_str} ")
    end

    @response.each(&block)
  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