সুন্দরভাবে একটি হ্যাশ মুদ্রণের সেরা উপায়


169

নেস্টেড অ্যারে এবং হ্যাশগুলির সাথে আমার একটি বড় হ্যাশ রয়েছে। আমি কেবল এটি মুদ্রণ করতে চাই যাতে এটি ব্যবহারকারীর কাছে 'পাঠযোগ্য'।

আমি চাই __মিল - এর মতো সাজানো হোক - এটি বেশ পঠনযোগ্য - তবে এখনও খুব প্রযুক্তিগত দেখাচ্ছে।

শেষ পর্যন্ত এটি শেষ ব্যবহারকারী হতে চলেছে যাদের এই ডেটা খণ্ডগুলি পড়তে হবে তাই তাদের পরিষ্কারভাবে ফর্ম্যাট করা দরকার।

কোনও পরামর্শ?



অনলাইন ইউটিলিটি jsonviewer.stack.hu । তবে এটি হ্যাশ রকেট সিনট্যাক্সের জন্য সঠিকভাবে কাজ করে না।
অমিত প্যাটেল

উত্তর:


256
require 'pp'
pp my_hash

আপনার ppযদি অন্তর্নির্মিত সমাধানের প্রয়োজন হয় এবং কেবল যুক্তিসঙ্গত লাইন ব্রেকগুলি চান তা ব্যবহার করুন ।

আপনি কোনও রত্ন ইনস্টল করতে পারলে দুর্দান্ত_প্রিন্ট ব্যবহার করুন । (আপনার ব্যবহারকারীদের উপর নির্ভর করে আপনি index:falseঅ্যারে সূচকগুলি প্রদর্শন বন্ধ করতে বিকল্পটি ব্যবহার করতে পারেন ))


পিপি দুর্দান্ত, তবে এটি সত্যই দুঃখের বিষয় যে কেউ গভীরতা সীমাবদ্ধ করতে পারে না।
আকিম

95

আপনি JSON থাকে, তাহলে আমি সুপারিশ JSON.pretty_generate(hash)করা হয়েছে কারণ এটি চেয়ে সহজ awesome_print , একটি দেখায় মহান preট্যাগ, এবং একটি ওয়েব পাতা থেকে সহজ কপি জন্য করতে পারবেন। (আরও দেখুন: আমি কীভাবে আমার জেএসএন আউটপুটটিকে রেলগুলিতে "সুন্দর" ফর্ম্যাট করতে পারি? )


এই উত্তরটি প্রকৃত উদাহরণ থেকে উপকৃত হবে
ট্র্যাভিস বিয়ার

@ ট্র্যাভিসবিয়ার আপনি যদি আমার উত্তরের "আরও দেখুন" লিঙ্কটি ক্লিক করেন তবে ফলাফলের উদাহরণ রয়েছে। আমি এই উত্তরটি বিশেষভাবে সুপারিশ করছি: stackoverflow.com/a/1823885/109618
ডেভিড জে

8
এটি হবেputs JSON.pretty_generate(hash)
joeloui

আপনার যদি জেএসএন তৈরি করার দরকার পড়ে তবে রুবি বা জেএস থেকে সুন্দর জেএসএন তৈরি করার জন্য আমাকে আমার নিজের (ফ্রি, ওএসএস, কোনও বিজ্ঞাপন) লাইব্রেরির সুপারিশ করার অনুমতি দিন: নিটজেসন (রুবি) এবং নেটজেএসএন (অনলাইন / জেএস)
ফ্রোগজ

দুঃখিত, আমি এখন বুঝতে পেরেছি যে সুন্দর_জেনারেট কোনও রুবি অবজেক্ট গ্রহণ করে, জাসন পাঠ্য নয়।
টনি

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)
এরিক আরবান

আমি আরও আশ্চর্য হয়েছি যে এটি আরও ভাল নথিভুক্ত নয়: আমি সবসময়ই আমার ব্যান্ডগুলি কনসোল হিসাবে পিস ব্যবহার করি এবং আমি দীর্ঘকাল ধরে খুঁজছিলাম যে অন্য কোনও রত্ন ব্যবহার না করে কীভাবে এটির প্রিন্টারে ট্যাপ করা যায়। উত্সাহিত করা হয়েছে কারণ এই সমাধানটি অবশেষে আমার দীর্ঘ অনুসন্ধানে শেষ করে দিয়েছে। :-)
উইজ

20

আপনার যদি কোনও অভিনব রত্ন ক্রিয়া না থেকে থাকে তবে আপনার কাছে জেএসওএন থাকে, এই সি এল এল লাইনটি একটি হ্যাশটিতে কাজ করবে:

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

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

  :key2 => "value2",

  :key3 => "value3"
}

8
Downvoted কারণ এই ইচ্ছার কোন কী ও মানগুলি রয়েছে আপ জগাখিচুড়ি ":"
thomax

1
এটি নাল (জেএসওএন) বনাম শূন্য (রুবি) নিয়েও কাজ করে না।
রেনেক্স

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

প্রাই ব্যবহার করে আপনাকে কেবল আপনার ~ / .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

এখানে জসন এবং রাউজ ব্যবহার করে অন্য একটি পদ্ধতি রয়েছে:

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

কারাগারে

যদি তুমি চাও

  • একটি "সুন্দর মুদ্রিত" হ্যাশ
  • উদাহরণস্বরূপ রেলস.লগার
  • যে, বিশেষত, রান 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প্রিটটিপ্রিন্ট থেকে আসে , যা রেলগুলি ডিফল্টরূপে অন্তর্ভুক্ত থাকে। সুতরাং, কোনও রত্নের প্রয়োজন নেই এবং জেএসএনে কোনও রূপান্তর প্রয়োজন।

কারাগারে নেই

আপনি যদি কারাগারে না থাকেন বা উপরের কারণগুলি যদি কোনও কারণে ব্যর্থ হয় তবে 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

কারাগারের আওতায়, রুবিতে অ্যারে এবং হ্যাশগুলিতে অন্তর্নির্মিত টু_জসন কার্য রয়েছে। আমি কেবল JSON ব্যবহার করব কারণ এটি একটি ওয়েব ব্রাউজারের মধ্যে খুব পঠনযোগ্য, যেমন গুগল ক্রোম।

এটি যদি বলা হয় যে আপনি যদি খুব বেশি "প্রযুক্তি দেখায়" দেখে উদ্বিগ্ন হন তবে আপনার সম্ভবত নিজের ফাংশনটি লিখতে হবে যা আপনার হ্যাশগুলিতে কোঁকড়া ধনুর্বন্ধনী এবং বর্গাকার ধনুর্বন্ধনী এবং সাদা স্থান এবং অন্যান্য অক্ষরের সাথে অ্যারেগুলিকে প্রতিস্থাপন করবে।

এটি করার জন্য খুব ভাল উপায়ে gsub ফাংশনটি সন্ধান করুন। আকর্ষণীয় মনে হচ্ছে এমন কিছু না পাওয়া পর্যন্ত বিভিন্ন চরিত্র এবং বিভিন্ন পরিমাণে সাদা জায়গার সাথে ঘুরে বেড়াতে থাকুন। http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub


7
অ্যারে এবং হ্যাশগুলির একটি অন্তর্নির্মিত টু_জসন পদ্ধতি নেই, এগুলি রেলগুলি থেকে অ্যাক্টিভসপোর্ট দ্বারা যুক্ত করা হয়েছে।
টম দে লিউ

এটি স্বাভাবিক আইআরবি / {"programming_language":{"ruby":{},"python":{}}}
পিএসের

ওপি কারাগারের কথা অস্বীকার করে নি
উইল শেপার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.