Bir karma güzel yazdırmanın en iyi yolu


169

İç içe diziler ve karma içeren büyük bir karma var. Basitçe çıktısını almak istiyorum böylece kullanıcıya 'okunabilir'.

Bir çeşit to_yaml gibi olmasını isterdim - bu oldukça okunabilir - ama yine de çok teknik görünüyor.

Sonuçta, bu veri yığınlarını okuması gereken son kullanıcılar olacak, böylece temiz bir şekilde biçimlendirilmeleri gerekiyor.

Baska öneri?



çevrimiçi yarar jsonviewer.stack.hu . Ancak karma roket sözdizimi için düzgün çalışmaz.
Amit Patel

Yanıtlar:


256
require 'pp'
pp my_hash

Yerleşik ppbir çözüme ihtiyacınız varsa ve sadece makul satır sonları istiyorsanız kullanın.

Bir mücevher yükleyebiliyorsanız awesome_print kullanın . (Kullanıcılarınıza bağlı olarak, index:falsedizi indekslerini görüntüleme seçeneğini kapatmak isteyebilirsiniz .)


pp güzel, ama kişinin derinliği sınırlayamaması üzücü.
akim

95

JSON'niz varsa , awesome_print'tenJSON.pretty_generate(hash) daha basit olduğu , bir etikette harika göründüğü ve bir web sayfasından kolay kopyalamaya izin verdiği için tavsiye ederim . (Ayrıca bkz: Ruby on Rails'deki JSON çıktımı nasıl "güzel" olarak biçimlendirebilirim? )pre


Bu cevap gerçek bir örnekten faydalanacak
Travis Bear

@TravisBear Cevabımda "ayrıca bakınız" bağlantısını tıklatırsanız örnek çıktı var. Bu yanıtı özellikle öneriyorum: stackoverflow.com/a/1823885/109618
David J.

8
O olurduputs JSON.pretty_generate(hash)
joeloui

JSON oluşturmanız gerekiyorsa, Ruby veya JS'den güzel JSON oluşturmak için kendi (ücretsiz, OSS, reklamsız) kütüphanemi önermeme izin verin: NeatJSON (Ruby) ve NeatJSON (Çevrimiçi / JS)
Phrogz

Maalesef, pretty_generate'nin json metni değil bir Ruby nesnesini kabul ettiğini anlıyorum.
Tony

26

Daha benim için daha iyi çalışır Başka bir çözüm ppveya awesome_print:

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

2
Not Pry::ColorPrinter.pp(obj)standart out yazıyor ama hedef dahil olmak üzere ek params, alabilir. BeğenPry::ColorPrinter.pp(obj, a_logger)
Eric Urban

Bunun daha iyi belgelenmediğine şaşırdım: Rails konsolum olarak her zaman gözetlemeyi kullanıyorum ve uzun zamandır başka bir mücevher kullanmadan güzel yazıcısına nasıl dokunacağımı arıyorum. Bu çözüm nihayet uzun aramamı sona erdirdiği için seçildi. :-)
wiz

20

Herhangi bir süslü mücevher eyleminiz yoksa, ancak JSON'unuz varsa, bu CLI satırı bir karma üzerinde çalışır:

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

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

  :key2 => "value2",

  :key3 => "value3"
}

8
Bu, ":" içeren anahtarları ve değerleri
dağıtacağı için indirildi

1
Bu da null (JSON) vs nil (Ruby) ile ilgilenmez.
17'de Rennex

1
Çoğu durum için hala kullanışlı.
Abram

1
Bu üç yıl sonra inanamıyorum! Teşekkürler @Abram. :) Dünyadaki en zarif çözüm değil, ama bir şeyleri bir tutam içinde hallediyor.
Nick Schwaderer

4

Kullanıcılara yazdırıyorsanız yukarıdaki cevapları kullanın.

Yalnızca konsolda kendiniz yazdırmak istiyorsanız, irb yerine gözetleme taşını kullanmanızı öneririm. Güzel baskının yanı sıra, pry'nin başka birçok özelliği de var (aşağıdaki railscast'i kontrol edin)

gem yüklemek gözetlemek

Ve bu railscast'i kontrol edin:

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


3

Anahtarlarınızın aklı başında olmanıza güveniyorsanız json ile yapmak kolaydır:

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
}

1

Pry kullanarak ~ / .pryrc dosyanıza aşağıdaki kodu eklemeniz yeterlidir:

require "awesome_print"
AwesomePrint.pry!

1

Denediğim tüm taşlar, show_datamücevher benim için en iyisini çalıştı, şimdi Rails'te params hash'ını hemen hemen her zaman günlük olarak kullanıyorum


0

Büyük iç içe geçmiş karmalar için bu komut dosyası sizin için yararlı olabilir. Kopyalamayı kolaylaştırmak için yalnızca girintili güzel bir python / benzeri sözdiziminde iç içe bir karma yazdırır.

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

Örnek kullanım:

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

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

Döndürülen değer, iç içe karma değerinin tüm son düzey değerlerinin sayısıdır (3).


0

İşte json ve rouge kullanan başka bir yaklaşım:

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))))

(örneğin yanıtını ayrıştırır RestClient)


0

Raylarda

Eğer ihtiyacın varsa

  • "güzel baskılı" karma
  • örneğin Rails.logger
  • özellikle inspectHash içindeki nesneler üzerinde çalışan
    • inspectnesnelerinizde olması gerektiği gibi yöntemi geçersiz kılar / tanımlarsanız yararlı olur .

... o zaman bu harika çalışıyor! (Ve daha iyi olur, Hash nesneniz daha büyük ve daha iç içe.)

logger.error my_hash.pretty_inspect

Örneğin:

class MyObject1
  def inspect
    "<#{'*' * 10} My Object 1 #{'*' * 10}>"
  end
end

class MyObject2
  def inspect
    "<#{'*' * 10} My Object 2 #{'*' * 10}>"
  end
end

my_hash = { a: 1, b: MyObject1.new, MyObject2.new => 3 }

Rails.logger.error my_hash
# {:a=>1, :b=><********** My Object 1 **********>, <********** My Object 2 **********>=>3}

# EW! ^

Rails.logger.error my_hash.pretty_inspect
# {:a=>1,
#  :b=><********** My Object 1 **********>,
#  <********** My Object 2 **********>=>3}

pretty_inspectraylar varsayılan olarak içeren PrettyPrint'ten gelir . Yani, hiçbir mücevher ve JSON dönüşüm gerekli.

Raylarda Değil

Rails'te değilseniz veya yukarıdaki herhangi bir nedenle başarısız olursa, require "pp"önce kullanmayı deneyin . Örneğin:

require "pp"  # <-----------

class MyObject1
  def inspect
    "<#{'*' * 10} My Object 1 #{'*' * 10}>"
  end
end

class MyObject2
  def inspect
    "<#{'*' * 10} My Object 2 #{'*' * 10}>"
  end
end

my_hash = { a: 1, b: MyObject1.new, MyObject2.new => 3 }

puts my_hash
# {:a=>1, :b=><********** My Object 1 **********>, <********** My Object 2 **********>=>3}

# EW! ^

puts my_hash.pretty_inspect
# {:a=>1,
#  :b=><********** My Object 1 **********>,
#  <********** My Object 2 **********>=>3}

Tam Bir Örnek

pretty_inspectProjemden, incelenen nesnelerimden projeye özgü metinlerle büyük ol ' ed Hash örneği düzeltildi:

{<***::******************[**:****, ************************:****]********* * ****** ******************** **** :: *********** - *** ******* *********>=>
  {:errors=>
    ["************ ************ ********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
     "************ ************ ********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
     "************ ************ ********** ***** ****** ******** is invalid",
     "************ ************ ********** is invalid",
     "************ ************ is invalid",
     "************ is invalid"],
   :************=>
    [{<***::**********[**:****, *************:**, ******************:*, ***********************:****] :: **** **** ****>=>
       {:************=>
         [{<***::***********[**:*****, *************:****, *******************:**]******* :: *** - ******* ***** - *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: *** - *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ********* - *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ********** - ********** *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ******** - *>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: **** - *******>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: *** - ********** ***** - *>=>
            {}}]}},
     {<***::**********[**:****, *************:**, ******************:*, ***********************:****] ******************** :: *** - *****>=>
       {:errors=>
         ["************ ********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
          "************ ********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
          "************ ********** ***** ****** ******** is invalid",
          "************ ********** is invalid",
          "************ is invalid"],
        :************=>
         [{<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]*********** :: ****>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
            {:errors=>
              ["********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
               "********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
               "********** ***** ****** ******** is invalid",
               "********** is invalid"],
             :**********************=>
              [{<***::*******************[**:******, ************************:***]****-************ ******************** ***: * :: *** - ***** * ****** ** - ******* * **: *******>=>
                 {:errors=>
                   ["***** ****** ******** **** ********** **** ***** ***** ******* ******",
                    "***** ****** ******** **** ********** is invalid"],
                  :***************=>
                   [{<***::********************************[**:******, *************:******, ***********:******, ***********:"************ ************"]** * *** * ****-******* * ******** * ********* ******************** *********************: ***** :: "**** *" -> "">=>
                      {:errors=>["**** ***** ***** ******* ******"],
                       :**********=>
                        {<***::*****************[**:******, ****************:["****** ***", "****** ***", "****** ****", "******* ***", "******* ****", "******* ***", "****"], **:""] :: "**** *" -> "">=>
                          {:errors=>
                            ["***** ******* ******",
                             "***** ******* ******"]}}}}]}}]}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}}]}}]}}

-4

Rails altında, Ruby'deki diziler ve sağlamaların yerleşik to_json işlevleri vardır. JSON'u bir web tarayıcısında, örneğin Google Chrome'da çok okunabilir olduğu için kullanırım.

Eğer çok "teknoloji görünümlü" bakmak konusunda endişeleniyorsanız söyleniyor muhtemelen muhtemelen karma ve parantez kare boşluklar ve diziler beyaz boşluk ve diğer karakterleri yerine kendi işlevinizi yazmalısınız.

Bunu yapmak için gsub işlevine bakın. Çekici görünen bir şey bulana kadar farklı karakterler ve farklı miktarda boşlukla oynamaya devam edin. http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub


7
Diziler ve karmaların yerleşik bir to_json yöntemi yoktur, bunlar Rails'ten ActiveSupport tarafından eklenir.
Tom De Leu

Normal irb / pry'den bile daha kötü:{"programming_language":{"ruby":{},"python":{}}}
Darek Nędza

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.