11

我有类似的东西:

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

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

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

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

4

7 回答 7

22

怎么样:

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>
于 2013-06-25T05:14:07.103 回答
5
irb(main)> puts queried_object.pretty_inspect

来自PrettyPrint,所以可能需要require 'pp'首先让它工作。

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

于 2016-09-19T17:52:13.133 回答
3
<%= raw JSON.pretty_generate(hash).gsub(" ","&nbsp;") %>
于 2013-10-12T21:21:13.390 回答
3

如果您(像我一样)发现pretty_generateRuby 的 JSON 库中内置的选项不够“漂亮”,我建议您使用我自己的NeatJSONgem 来格式化。

要使用它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?"}
  ]
}

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

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

// 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"
}
于 2015-04-16T15:54:46.367 回答
3

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

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

此外,您可以将配置样式的值更改为哈希视图

于 2017-10-26T15:38:38.843 回答
2

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

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

干杯!

于 2013-06-25T10:19:41.333 回答
0

使用纯 Ruby 的漂亮打印Hash(无宝石)

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

我有一个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"
    ]
  }
}
于 2021-07-17T08:55:43.533 回答