webentwicklung-frage-antwort-db.com.de

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

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 wie to_yaml ist - das ist ziemlich lesbar - aber immer noch zu technisch aussehend. 

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

Irgendwelche Vorschläge?

148
Adam O'Connor
require 'pp'
pp my_hash

Verwenden Sie pp , wenn Sie eine integrierte Lösung benötigen und nur vernünftige Zeilenumbrüche benötigen.

Verwenden Sie awesome_print , wenn Sie einen Edelstein installieren können. (Abhängig von Ihren Benutzern möchten Sie möglicherweise die Option index:false verwenden, um die Anzeige von Array-Indizes zu deaktivieren.)

221
Phrogz

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

75
David J.

Eine andere Lösung, die für mich besser geeignet ist als pp oder awesome_print:

require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
22
Alex D

Wenn Sie keine ausgefallene Juwelenaktion haben, aber über JSON verfügen, funktioniert diese CLI-Zeile mit einem Hash:

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

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

  :key2 => "value2",

  :key3 => "value3"
}
14
Nick Schwaderer

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

Wenn Sie es nur für sich selbst in der Konsole ausdrucken möchten, schlage ich vor, den Edelstein statt irb zu verwenden. Neben dem hübschen Drucken bietet pry noch viele weitere Funktionen (siehe railcast unten)

edelstein installieren pry

Und check diesen Railcast:

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

4
Abdo

Von allen Edelsteinen, die ich ausprobiert habe, hat show_data gem am besten für mich gearbeitet, ich benutze es jetzt ausgiebig, um Params-Hash in Rails fast immer zu protokollieren

1
Dr.Strangelove

Mit Pry müssen Sie lediglich ~/.pryrc mit folgendem Code versehen:

require "awesome_print"
AwesomePrint.pry!
1
bartoindahouse

Für große verschachtelte Hashes kann dieses Skript hilfreich sein. Es druckt einen verschachtelten Hash in einer Nice-Python-ähnlichen Syntax mit nur Einzügen, 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

Beispielverwendung:

  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 Werte auf Endebene des verschachtelten Hashs.

0
swilgosz

Hier ist ein Ansatz mit Json und Rogue:

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 die Antwort von beispielsweise RestClient)

0
Adobe

Einfach mit Json zu tun, wenn Sie darauf vertrauen, dass Ihre Schlüssel gesund 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
}
0
grosser