【问题标题】:How do I pretty print a hash to a Rails view?如何将哈希打印到 Rails 视图?
【发布时间】:2013-06-21 18:45:43
【问题描述】:

我有类似的东西:

{"a":"1","b":"2","c":"3","asefw":"dfsef"}

我想在视图中打印出来。最好的方法是什么?

我尝试将其解析为 JSON 对象并使用 JSON.stringify,但它似乎弄乱了缩进。

有什么建议吗?我不介意 JavaScript 解决方案。

【问题讨论】:

  • 你有一个字符串还是一个 Hash 对象?
  • 你让我们猜测你想要什么,这是不公平的。我们无法猜测,因为他们暂停了我们的读心能力。我们可以买线索吗?
  • 看来你已经猜到了 :) 抽奖。
  • 可能的 JavaScript 解决方案的代码美化器:stackoverflow.com/questions/160694/…

标签: ruby-on-rails ruby json hash pretty-print


【解决方案1】:

怎么样:

require 'json'

hash = JSON['{"a":"1","b":"2","c":"3","asefw":"dfsef"}']
puts JSON.pretty_generate(hash)

哪些输出:

{
  "a": "1",
  "b": "2",
  "c": "3",
  "asefw": "dfsef"
}

JSON.pretty_generate 更像是一个调试工具,而不是我在实际生成要发送到浏览器的 JSON 时所依赖的工具。由于添加了空白,“漂亮”方面也意味着“臃肿”和“较慢”,但它有助于诊断和理解结构中的内容,因此它可能会很好地满足您的需求。

要记住的一点是,当浏览器呈现 HTML 时,空格会被吞噬,因此空格会消失。为避免这种情况,您必须将 JSON 输出包装在 <pre> 块中以保留空格和换行符。像这样的东西应该可以工作:

<pre>
{
  "a": "1",
  "b": "2",
  "c": "3",
  "asefw": "dfsef"
}
</pre>

【讨论】:

  • 我不同意,如果您的产品是开发人员将使用的 API,那么干净的 JSON 对他们来说可能是一件好事,并且使用 gzip 压缩添加的空格并不是什么负担。无论哪种方式,在您的 API 中都可以选择漂亮打印或不打印。
  • 我们使用浏览器插件,让我们在调试时查看代码输出时可以看到“美化”的 JSON,但代码本身会输出标准 JSON。在应用程序之间发送额外的空间是没有意义的,因为它们不在乎。只有人类会这样做,所以浏览器插件让我们很开心。
  • JSON 天生缺乏 DATE 支持,如果您的哈希包含日期,则使用 JSON 会很糟糕......您将无法通过查看对象是“真实”日期还是 JSON 以来的字符串化日期来判断将始终对其进行字符串化。
【解决方案2】:
irb(main)> puts queried_object.pretty_inspect

来自PrettyPrint,因此可能需要先require 'pp' 才能正常工作。

这也适用于例如Rails.logger 输出。

【讨论】:

    【解决方案3】:
    <%= raw JSON.pretty_generate(hash).gsub(" ","&nbsp;") %>
    

    【讨论】:

      【解决方案4】:

      如果您(像我一样)发现 Ruby 的 JSON 库中内置的 pretty_generate 选项不够“漂亮”,我推荐我自己的 NeatJSON gem 用于格式化。

      使用它gem install neatjson,然后使用JSON.neat_generate 而不是JSON.pretty_generate

      像 Ruby 的 pp 一样,它会在适合的情况下将对象和数组保持在一行,但根据需要包装成多个。例如:

      {
        "navigation.createroute.poi":[
          {"text":"Lay in a course to the Hilton","params":{"poi":"Hilton"}},
          {"text":"Take me to the airport","params":{"poi":"airport"}},
          {"text":"Let's go to IHOP","params":{"poi":"IHOP"}},
          {"text":"Show me how to get to The Med","params":{"poi":"The Med"}},
          {"text":"Create a route to Arby's","params":{"poi":"Arby's"}},
          {
            "text":"Go to the Hilton by the Airport",
            "params":{"poi":"Hilton","location":"Airport"}
          },
          {
            "text":"Take me to the Fry's in Fresno",
            "params":{"poi":"Fry's","location":"Fresno"}
          }
        ],
        "navigation.eta":[
          {"text":"When will we get there?"},
          {"text":"When will I arrive?"},
          {"text":"What time will I get to the destination?"},
          {"text":"What time will I reach the destination?"},
          {"text":"What time will it be when I arrive?"}
        ]
      }
      

      它还支持多种formatting options,以进一步自定义您的输出。例如,冒号前后有多少个空格?逗号之前/之后?在数组和对象的括号内?您想对对象的键进行排序吗?你想让冒号都排成一行吗?

      例如,使用您的示例哈希,您可以获得这些不同的输出,具体取决于您想要什么:

      // JSON.neat_generate(o, wrap:true)
      {
        "a":"1",
        "b":"2",
        "c":"3",
        "asefw":"dfsef"
      }
      
      // JSON.neat_generate o, wrap:true, aligned:true
      {
        "a"    :"1",
        "b"    :"2",
        "c"    :"3",
        "asefw":"dfsef"
      }
      
      // JSON.neat_generate o, wrap:true, aligned:true, around_colon:1
      {
        "a"     : "1",
        "b"     : "2",
        "c"     : "3",
        "asefw" : "dfsef"
      }
      

      【讨论】:

        【解决方案5】:

        你可以试试 gem awesome_print 效果很好,在你看来写

        <%= ap(your_hash, plain: true, indent: 0).html_safe %>
        

        另外,您可以将配置样式的值更改为散列视图

        【讨论】:

          【解决方案6】:

          给定的响应可以正常工作,但是如果您想要更漂亮和更自定义的漂亮哈希,请使用awesome_print

          require 'awesome_print'
          hash = JSON['{"a":"1","b":"2","c":"3","asefw":"dfsef"}']
          ap hash 
          

          干杯!

          【讨论】:

          • awesome_print 有一个不幸的缺陷,即强制哈希对齐,因此 => 值对齐,但对于嵌套哈希(嵌套哈希值实际上显示在父哈希值的左侧)效果不佳。
          【解决方案7】:

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

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

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

          这是代码+示例

          • 使用 pretty_generate 获得格式良好的 JSON 字符串。
          • 将所有 JSON 键替换为 symbol: 等效项
          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"
              ]
            }
          }
          

          【讨论】:

            猜你喜欢
            • 2022-12-10
            • 1970-01-01
            • 2019-11-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-30
            • 2012-08-14
            • 2012-10-23
            相关资源
            最近更新 更多