Der beste Weg, um einen Hash hübsch zu drucken

169

Ich habe einen großen Hash mit verschachtelten Arrays und Hashes. Ich möchte es einfach ausdrucken, damit es für den Benutzer "lesbar" ist.

Ich möchte, dass es so etwas wie to_yaml ist - das ist ziemlich lesbar - aber immer noch zu technisch.

Letztendlich werden es Endbenutzer sein, die diese Datenblöcke lesen müssen, damit sie sauber formatiert werden müssen.

Irgendwelche Vorschläge?

Adam O'Connor
quelle
Online-Dienstprogramm jsonviewer.stack.hu . Es funktioniert jedoch nicht richtig für die Hash-Rocket-Syntax.
Amit Patel

Antworten:

256
require 'pp'
pp my_hash

Verwenden ppSie diese Option, wenn Sie eine integrierte Lösung benötigen und nur angemessene Zeilenumbrüche wünschen.

Verwenden Sie awesome_print, wenn Sie einen Edelstein installieren können. (Abhängig von Ihren Benutzern möchten Sie möglicherweise die index:falseOption zum Deaktivieren der Anzeige von Array-Indizes verwenden.)

Phrogz
quelle
pp ist nett, aber es ist wirklich schade, dass man die Tiefe nicht einschränken kann.
Akim
95

Wenn Sie JSON haben, empfehle ich, JSON.pretty_generate(hash)weil es einfacher als awesome_print ist , in einem preTag gut aussieht und das einfache Kopieren von einer Webseite ermöglicht. (Siehe auch: Wie kann ich meine JSON-Ausgabe in Ruby on Rails "hübsch" formatieren? )

David J.
quelle
Diese Antwort würde von einem tatsächlichen Beispiel profitieren
Travis Bear
@TravisBear Es gibt eine Beispielausgabe, wenn Sie in meiner Antwort auf den Link "Siehe auch" klicken. Ich empfehle diese Antwort insbesondere: stackoverflow.com/a/1823885/109618
David J.
8
Es wäreputs JSON.pretty_generate(hash)
Joeloui
Wenn Sie JSON erstellen müssen, erlauben Sie mir, meine eigene (kostenlose, OSS-, keine Werbung) Bibliothek zum Erstellen von hübschem JSON aus Ruby oder JS zu empfehlen : NeatJSON (Ruby) und NeatJSON (Online / JS)
Phrogz
Entschuldigung, mir ist jetzt klar, dass Pretty_generate ein Ruby-Objekt akzeptiert, keinen JSON-Text.
Tony
26

Eine andere Lösung, die für mich besser funktioniert als ppoder awesome_print:

require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
Alex D.
quelle
2
Beachten Sie, dass das Pry::ColorPrinter.pp(obj)Schreiben in den Standardausgang erfolgt, jedoch zusätzliche Parameter, einschließlich des Ziels, erforderlich sind. Gefällt Pry::ColorPrinter.pp(obj, a_logger)
Eric Urban
Ich bin überrascht, dass dies nicht besser dokumentiert ist: Ich verwende immer Pry als meine Rails-Konsole, und ich habe lange gesucht, wie ich auf seinen hübschen Drucker zugreifen kann, ohne ein anderes Juwel zu verwenden. Upvoted, weil diese Lösung meiner langen Suche endlich ein Ende gesetzt hat. :-)
wiz
20

Wenn Sie keine ausgefallene Edelsteinaktion haben, aber JSON haben, funktioniert diese CLI-Zeile mit einem Hash:

puts JSON.pretty_generate(my_hash).gsub(":", " =>")

#=>
{
  :key1 => "value1",

  :key2 => "value2",

  :key3 => "value3"
}
Nick Schwaderer
quelle
8
Downvoted, weil dies alle Schlüssel und Werte
durcheinander bringt
1
Dies betrifft auch nicht null (JSON) vs nil (Ruby).
Rennex
1
Für die meisten Situationen immer noch praktisch.
Abram
1
Ich kann das drei Jahre später nicht glauben! Danke @Abram. :) Es ist nicht die eleganteste Lösung der Welt, aber es erledigt die Dinge zur Not.
Nick Schwaderer
4

Verwenden Sie die obigen Antworten, wenn Sie an Benutzer drucken.

Wenn Sie es nur für sich selbst in der Konsole drucken möchten, empfehle ich, anstelle von irb den Pry Gem zu verwenden. Neben dem hübschen Drucken bietet pry noch viele andere Funktionen (siehe Railscast unten).

Edelstein installieren Pry

Und überprüfen Sie diesen Railscast:

http://railscasts.com/episodes/280-pry-with-rails

Abdo
quelle
3

Einfach mit json zu tun, wenn Sie darauf vertrauen, dass Ihre Schlüssel vernünftig sind:

JSON.pretty_generate(a: 1, 2 => 3, 3 => nil).
  gsub(": null", ": nil").
  gsub(/(^\s*)"([a-zA-Z][a-zA-Z\d_]*)":/, "\\1\\2:"). # "foo": 1 -> foo: 1
  gsub(/(^\s*)(".*?"):/, "\\1\\2 =>") # "123": 1 -> "123" => 1

{
  a: 1,
  "2" => 3,
  "3" => nil
}
gröber
quelle
1

Mit Pry müssen Sie Ihrem ~ / .pryrc nur den folgenden Code hinzufügen:

require "awesome_print"
AwesomePrint.pry!
Bartoindahouse
quelle
1

Von allen Edelsteinen, die ich ausprobiert habe, hat show_dataEdelstein am besten für mich funktioniert. Ich verwende ihn jetzt ausgiebig, um Parameter-Hash in Rails zu protokollieren

Dr. Strangelove
quelle
0

Bei großen verschachtelten Hashes kann dieses Skript für Sie hilfreich sein. Es druckt einen verschachtelten Hash in einer schönen Python / ähnlichen Syntax mit nur Einrückungen, um das Kopieren zu vereinfachen.

module PrettyHash
  # Usage: PrettyHash.call(nested_hash)
  # Prints the nested hash in the easy to look on format
  # Returns the amount of all values in the nested hash

  def self.call(hash, level: 0, indent: 2)
    unique_values_count = 0
    hash.each do |k, v|
      (level * indent).times { print ' ' }
      print "#{k}:"
      if v.is_a?(Hash)
        puts
        unique_values_count += call(v, level: level + 1, indent: indent)
      else
        puts " #{v}"
        unique_values_count += 1
      end
    end
    unique_values_count
  end
end

Anwendungsbeispiel:

  h = {a: { b: { c: :d }, e: :f }, g: :i }
  PrettyHash.call(h)

a:
  b:
    c: d
  e: f
g: i
=> 3

Der zurückgegebene Wert ist die Anzahl (3) aller End-Level-Werte des verschachtelten Hash.

swilgosz
quelle
0

Hier ist ein anderer Ansatz mit json und rouge:

require 'json'
require 'rouge'

formatter = Rouge::Formatters::Terminal256.new
json_lexer = Rouge::Lexers::JSON.new

puts formatter.format(json_lexer.lex(JSON.pretty_generate(JSON.parse(response))))

(analysiert Antwort von zB RestClient)

Adobe
quelle
-4

Unter Rails verfügen Arrays und Hashes in Ruby über integrierte to_json-Funktionen. Ich würde JSON verwenden, nur weil es in einem Webbrowser, z. B. Google Chrome, sehr gut lesbar ist.

Wenn Sie sich jedoch Sorgen machen, dass es zu "technisch aussehend" aussieht, sollten Sie wahrscheinlich Ihre eigene Funktion schreiben, die die geschweiften Klammern und eckigen Klammern in Ihren Hashes und Arrays durch Leerzeichen und andere Zeichen ersetzt.

Suchen Sie in der gsub-Funktion nach einer sehr guten Möglichkeit, dies zu tun. Spielen Sie weiter mit verschiedenen Charakteren und verschiedenen Leerzeichen, bis Sie etwas finden, das ansprechend aussieht. http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub

Sid
quelle
7
Arrays und Hashes verfügen nicht über eine integrierte to_json-Methode. Diese werden von ActiveSupport aus Rails hinzugefügt.
Tom De Leu
Es ist noch schlimmer als normal irb / pry:{"programming_language":{"ruby":{},"python":{}}}
Darek Nędza
OP schloss Rails nicht aus
Will Sheppard