漂亮打印哈希的最佳方法

时间:2012-01-12 21:26:49

标签: ruby ruby-on-rails-3

我有一个带有嵌套数组和哈希值的大哈希。我想简单地将其打印出来,以便用户“可读”。

我希望它有点像to_yaml - 这很可读 - 但仍然看起来很科技。

最终,它将成为需要阅读这些数据块的最终用户,因此需要对其进行干净的格式化。

有什么建议吗?

14 个答案:

答案 0 :(得分:226)

require 'pp'
pp my_hash

如果您需要内置解决方案,只需要合理的换行符,请使用pp

如果您可以安装gem,请使用awesome_print。 (根据您的用户,您可能希望使用index:false选项关闭显示数组索引。)

答案 1 :(得分:77)

如果你有JSON,我推荐JSON.pretty_generate(hash)因为它比awesome_print更简单,在pre标签中看起来很棒,并且允许从网页轻松复制。 (另见:How can I "pretty" format my JSON output in Ruby on Rails?

答案 2 :(得分:23)

另一种比ppawesome_print更适合我的解决方案:

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

答案 3 :(得分:13)

如果你没有任何花哨的gem动作,但确实有JSON,那么这个CLI行将使用哈希:

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

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

  :key2 => "value2",

  :key3 => "value3"
}

答案 4 :(得分:4)

如果您要向用户打印,请使用上面的答案。

如果您只想在控制台中自己打印,我建议使用pry gem而不是irb。除了漂亮的打印,pry还有很多其他功能(请查看下面的railscast)

  

gem install pry

并查看此railscast:

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

答案 5 :(得分:1)

使用Pry你只需要将以下代码添加到〜/ .pryrc:

require "awesome_print"
AwesomePrint.pry!

答案 6 :(得分:1)

在我尝试过的所有宝石中,show_data gem对我来说效果最好,我现在用它来广泛地记录Rails中的params哈希

答案 7 :(得分:1)

在Rails中

如果需要

  • “漂亮打印”哈希值
  • 例如Rails.logger
  • ,特别是在哈希中的对象上运行inspect
    • 如果您像应该那样覆盖/定义对象中的inspect方法,这将很有用

...那么这很好用! (而且更好的是,您的Hash对象更大,更嵌套)。

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 comes from PrettyPrint,默认情况下包含其中。因此,不需要gem,也无需转换为JSON。

不在Rails中

如果您不在Rails中,或者由于某种原因上述操作失败,请首先尝试使用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=>
                            ["***** ******* ******",
                             "***** ******* ******"]}}}}]}}]}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}}]}}]}}

答案 8 :(得分:0)

这是一种使用json和流氓的方法:

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的响应)

答案 9 :(得分:0)

如果您相信自己的密钥是理智的,则可以轻松使用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
}

答案 10 :(得分:0)

对于大嵌套哈希,此脚本可能对您有所帮助。它以漂亮的python / like语法打印嵌套的哈希,仅带有缩进,以便于复制。

there was a conflict

用法示例:

AssemblyConflicts.txt

返回的值是嵌套哈希的所有最终级别值的计数(3)。

答案 11 :(得分:0)

我通过搜索引擎来到这里,寻找一种以人类可读的格式向最终用户打印哈希的方法,尤其是在键中带有下划线的哈希。

这就是我最终使用Rails 6.0.3.4所做的事情:

hash.map do |key, val|
  key.to_s.humanize + ': ' + val.to_s
end.join('; ')

# Turns {:foo_bar => 'baz', :fee_ber => :bez} into 'Foo bar: Baz; Fee ber: Bez'.

答案 12 :(得分:0)

Pretty Print Hash 使用纯 Ruby(无宝石)

我遇到了这个线程,试图为自己解决这个问题。

我有一个很大的 Hash,我想让它变得漂亮,但我需要使用 ruby​​ 哈希表示法而不是 JSON。

这是代码+示例

  • 使用pretty_generate 获得一个漂亮的格式化JSON 字符串。
  • symbol: 等价物替换所有 JSON 键
puts JSON.pretty_generate(result)
         .gsub(/(?:\"|\')(?<key>[^"]*)(?:\"|\')(?=:)(?:\:)/) { |_|
              "#{Regexp.last_match(:key)}:"
          }

示例 JSON

{
  "extensions": {
    "heading": "extensions",
    "take": "all",
    "array_columns": [
      "name"
    ]
  },
  "tables": {
    "heading": "tables",
    "take": "all",
    "array_columns": [
      "name"
    ]
  },
  "foreign_keys": {
    "heading": "foreign_keys",
    "take": "all",
    "array_columns": [
      "name"
    ]
  },
  "all_indexes": {
    "heading": "all_indexes",
    "take": "all",
    "array_columns": [
      "name"
    ]
  },
  "keys": {
    "heading": "keys",
    "take": "all",
    "array_columns": [
      "name"
    ]
  }
}

示例 Ruby 哈希

{
  extensions: {
    heading: "extensions",
    take: "all",
    array_columns: [
      "name"
    ]
  },
  tables: {
    heading: "tables",
    take: "all",
    array_columns: [
      "name"
    ]
  },
  foreign_keys: {
    heading: "foreign_keys",
    take: "all",
    array_columns: [
      "name"
    ]
  },
  all_indexes: {
    heading: "all_indexes",
    take: "all",
    array_columns: [
      "name"
    ]
  },
  keys: {
    heading: "keys",
    take: "all",
    array_columns: [
      "name"
    ]
  }
}

答案 13 :(得分:-4)

在Rails下,Ruby中的数组和散列具有内置的to_json函数。我会使用JSON只是因为它在Web浏览器中非常易读,例如谷歌浏览器。

如果你担心它看起来太“看起来像技术”,你应该写自己的功能,用空白和其他字符替换你的哈希和数组中的花括号和方括号。

查找gsub函数以获得一个非常好的方法。继续玩不同的角色和不同数量的空白,直到你找到一些看起来很吸引人的东西。 http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub