我有一个大哈希嵌套数组和哈希。我想简单地打印出来,所以它'可读'的用户。
我希望它有点像to_yaml -这是相当可读的-但仍然太高科技看起来。
最终需要读取这些数据块的将是最终用户,因此它们需要被清晰地格式化。
有什么建议吗?
我有一个大哈希嵌套数组和哈希。我想简单地打印出来,所以它'可读'的用户。
我希望它有点像to_yaml -这是相当可读的-但仍然太高科技看起来。
最终需要读取这些数据块的将是最终用户,因此它们需要被清晰地格式化。
有什么建议吗?
当前回答
如果你相信你的键是正常的,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
}
其他回答
另一个解决方案比pp或awesome_print更适合我:
require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
使用纯Ruby的漂亮打印散列(没有宝石)
我看到这个帖子是为了自己解决这个问题。
我有一个大的哈希,我想让漂亮,但我需要保持在ruby哈希符号,而不是JSON。
这是代码+示例
使用pretty_generate来获得格式化好的JSON字符串。 将所有JSON键替换为symbol: equivalent
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"
]
}
}
require 'pp'
pp my_hash
如果你需要一个内置的解决方案,只是想要合理的换行,可以使用pp。
如果可以安装gem,请使用awesome_print。(取决于你的用户,你可能希望使用index:false选项来关闭显示数组下标。)
下面是使用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的响应)
我是通过一个搜索引擎来寻找一种以人类可读的格式打印哈希值给最终用户的方法的——特别是键中带有下划线的哈希值。
以下是我最终使用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'.