सबसे अच्छा तरीका हैश को प्रिंट करना


169

मेरे पास नेस्टेड एरेज़ और हैश के साथ एक बड़ा हैश है। मैं इसे केवल प्रिंट करना चाहूंगा ताकि यह उपयोगकर्ता के लिए 'पठनीय' हो।

मैं चाहूंगा कि यह to_yaml की तरह हो - यह बहुत पठनीय है - लेकिन फिर भी बहुत ही तकनीकी लग रही है।

अंतत: इसका अंत उपयोगकर्ताओं को होने जा रहा है, जिन्हें इन आंकड़ों को पढ़ने की आवश्यकता है, ताकि उन्हें साफ-सुथरा स्वरूपित करने की आवश्यकता हो।

कोई सुझाव?



ऑनलाइन उपयोगिता jsonviewer.stack.hu । हालाँकि यह हैश रॉकेट सिंटैक्स के लिए ठीक से काम नहीं करता है।
अमित पटेल

जवाबों:


256
require 'pp'
pp my_hash

उपयोग करें ppयदि आपको एक अंतर्निहित समाधान की आवश्यकता है और बस उचित लाइन ब्रेक चाहते हैं।

यदि आप एक मणि स्थापित कर सकते हैं, तो Awesome_print का उपयोग करें । (अपने उपयोगकर्ताओं के आधार पर, आप index:falseऐरे सूचकांकों को बंद करने के विकल्प का उपयोग करना चाह सकते हैं ।)


पीपी अच्छा है, लेकिन यह वास्तव में एक दया है कि कोई गहराई को सीमित नहीं कर सकता है।
एकिम

95

यदि आपके पास JSON है, तो मैं सलाह देता हूं JSON.pretty_generate(hash)कि यह भयानक_प्रिंट से सरल है , एक preटैग में बहुत अच्छा लगता है , और एक वेब पेज से आसानी से कॉपी करने की अनुमति देता है। (यह भी देखें: मैं रूबी ऑन रेल्स में अपने JSON आउटपुट को "सुंदर" कैसे बना सकता हूं? )


यह उत्तर वास्तविक उदाहरण से लाभान्वित होगा
ट्रैविस बेयर

@TravisBear उदाहरण आउटपुट है यदि आप मेरे जवाब में "देखें भी" लिंक पर क्लिक करते हैं। मैं इस जवाब को विशेष रूप
डेविड जे।

8
यह होगाputs JSON.pretty_generate(hash)
joeloui

यदि आपको JSON बनाने की आवश्यकता है, तो मुझे Ruby या JS: NeatJSON (Ruby) और NeatJSON (Online / JS)
Phrogz

क्षमा करें, मुझे अब पता चला है कि pretty_generate रूबी ऑब्जेक्ट को स्वीकार करता है, न कि json टेक्स्ट।
टोनी

26

एक और समाधान जो मेरे लिए ppया उससे बेहतर काम करता है awesome_print:

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

2
ध्यान दें कि Pry::ColorPrinter.pp(obj)बाहर मानक के लिए लिखते हैं, लेकिन गंतव्य सहित अतिरिक्त परम ले सकते हैं। जैसेPry::ColorPrinter.pp(obj, a_logger)
एरिक अर्बन

मुझे आश्चर्य है कि यह बेहतर प्रलेखित नहीं है: मैं हमेशा अपने रेल कंसोल के रूप में pry का उपयोग करता हूं, और मैं लंबे समय से देख रहा हूं कि किसी अन्य मणि का उपयोग किए बिना इसके सुंदर-प्रिंटर में कैसे टैप किया जाए। अपवादात्मक क्योंकि इस समाधान ने आखिरकार मेरी लंबी खोज का अंत कर दिया। :-)
जानकार

20

यदि आपके पास कोई फैंसी मणि कार्रवाई नहीं है, लेकिन JSON है, तो यह CLI लाइन एक हैश पर काम करेगी:

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

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

  :key2 => "value2",

  :key3 => "value3"
}

8
नीच क्योंकि यह किसी भी कुंजी और मूल्यों को गड़बड़ करेगा जिसमें ":"
थोमैक्स

1
यह शून्य (JSON) बनाम नील (रूबी) के साथ भी व्यवहार नहीं करता है।
रेनेक्स

1
अभी भी ज्यादातर स्थितियों के लिए काम करते हैं।
अब्राम

1
इस तीन साल बाद विश्वास नहीं कर सकता! धन्यवाद @ अब्रम :) यह दुनिया में सबसे सुंदर समाधान नहीं है, लेकिन यह चुटकी में किया जाता है।
निक शवडेरर

4

यदि आप उपयोगकर्ताओं को प्रिंट कर रहे हैं तो उपरोक्त उत्तरों का उपयोग करें।

यदि आप केवल कंसोल में खुद के लिए इसे प्रिंट करना चाहते हैं, तो मैं सुझाव देता हूं कि आईआरबी के बजाय प्राइ मणि का उपयोग करें। प्रिटिंग के अलावा, प्राइ में और भी बहुत सारी खूबियाँ हैं (नीचे की जाँच करें)

मणि स्थापित करें

और इस रेलकास्ट की जाँच करें:

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


3

अगर आप अपनी चाबियों पर भरोसा करना चाहते हैं, तो json के साथ करना आसान है:

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 का उपयोग करके आपको निम्नलिखित कोड अपने ~ / .pryrc में जोड़ने की आवश्यकता है:

require "awesome_print"
AwesomePrint.pry!

1

मेरे द्वारा आजमाए गए सभी रत्नों में से, show_dataमणि ने मेरे लिए सबसे अच्छा काम किया, अब मैं इसका उपयोग बड़े पैमाने पर पैराग्राफ हैश को रेल में करने के लिए करता हूं


0

बड़े नेस्टेड हैश के लिए यह स्क्रिप्ट आपके लिए मददगार हो सकती है। यह एक नेस्टेड हैश को एक अच्छे अजगर में / जैसे सिंटेक्स की तरह प्रिंट करता है ताकि इसे कॉपी करने में आसानी हो।

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

उदाहरण उपयोग:

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

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

लौटाया गया मान नेस्टेड हैश के सभी अंत-स्तरीय मूल्यों की गिनती (3) है।


0

यहाँ json और 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))))

(उदाहरण से पार्स प्रतिक्रिया RestClient)


0

रेल में

अगर तुम्हे जरुरत हो

  • एक "सुंदर मुद्रित" हैश
  • जैसे Rails.logger
  • वह, विशेष रूप से, चलाता है inspect हैश में वस्तुओं पर
    • यदि आप inspectअपनी वस्तुओं में इस पद्धति को ओवरराइड / परिभाषित करते हैं, तो यह आपके लिए उपयोगी है , जैसे कि आपको माना जाता है

... तो यह महान काम करता है! (और बेहतर हो जाता है, अपने हैश ऑब्जेक्ट बड़ा और अधिक नेस्टेड है।)

logger.error my_hash.pretty_inspect

उदाहरण के लिए:

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_inspectसुंदर से आता है , जिसमें डिफ़ॉल्ट रूप से रेल शामिल है। इसलिए, किसी रत्न की आवश्यकता नहीं थी और JSON को किसी भी रूपांतरण की आवश्यकता नहीं थी।

रेल में नहीं

यदि आप रेल में नहीं हैं या यदि ऊपर किसी कारण से विफल रहता है, तो require "pp"पहले का उपयोग करने का प्रयास करें । उदाहरण के लिए:

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}

एक पूर्ण उदाहरण

pretty_inspectमेरे निरीक्षण की गई वस्तुओं से परियोजना-विशिष्ट पाठ के साथ मेरे प्रोजेक्ट से बिग ऑल का एड हैश उदाहरण:

{<***::******************[**:****, ************************:****]********* * ****** ******************** **** :: *********** - *** ******* *********>=>
  {: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

रेल के तहत, रूबी में सरणियों और हैश में अंतर्निहित in_json फ़ंक्शन हैं। मैं JSON का उपयोग सिर्फ इसलिए करूंगा क्योंकि यह वेब ब्राउज़र, जैसे Google Chrome में बहुत पठनीय है।

यह कहा जा रहा है कि यदि आप इसके बारे में चिंतित हैं, तो "टेक लुकिंग" भी दिख रहा है, तो आपको संभवतः अपना स्वयं का फ़ंक्शन लिखना चाहिए जो आपके हैश में घुंघराले ब्रेसिज़ और चौकोर ब्रेसिज़ को बदल देता है और व्हाइट-स्पेस और अन्य वर्णों के साथ एरे करता है।

इसे करने के लिए बहुत अच्छे तरीके से gsub फ़ंक्शन देखें। जब तक आपको ऐसा कुछ न मिले, जो आपको आकर्षक लग रहा हो, तब तक अलग-अलग पात्रों और अलग-अलग व्हाट्सएप के साथ खेलते रहें। http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub


7
Arrays और hashes में एक अंतर्निहित in_json विधि नहीं है, इन्हें Rails से ActiveSupport द्वारा जोड़ा जाता है।
टॉम डे ल्यू

यह सामान्य irb / pry से भी बदतर है:{"programming_language":{"ruby":{},"python":{}}}
Darek Nzadza

ओपी ने रेल को बंद नहीं किया
विल शेपर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.