在Ruby中打印JSON打印 - 使用换行

时间:2015-10-23 06:09:17

标签: ruby json pretty-print

使用智能换行>在Ruby 中打印JSON的最佳方法是什么,underscore-cli中“json”输出格式化程序处理它的方式是什么?

例如,常规的JSON漂亮打印机将输出:

{
  "a": [
    "b",
    "c"
  ],
  "d": {
    "e": "f"
  },
  "g": [
    "some longer string"
  ]
}

但我正在寻找Ruby中可配置的漂亮打印机,就像下划线cli一样,注意到小结构会造成无意义的短线,所以输出如下:

{
  "a": [ "b", "c" ],
  "d": { "e": "f" },
  "g": [ "some longer string" ]
}

我已经玩过JSON.generate()中提供的选项(空格,空格等),但无济于事。

我正在编写一个生成多个JSON文件的脚本,这些文件旨在让人类可以理解(如果需要的话) - 我不能指望在任何地方都可以使用下划线,所以我不能(并且,呃,不会我想要通过下划线输出输出,但是默认的JSON.pretty_generate()输出文件的可读性差得多,大约是下划线的三倍(2,200行对750)。

Ruby 2.0.0p481。

3 个答案:

答案 0 :(得分:1)

neatjson看起来会what I want

答案 1 :(得分:0)

如果您的要求很少,您可以使用JSON#generate选项来避免使用额外的宝石。虽然我完全同意neatjson让它更清洁。

一个简单的例子:

a = {"a"=>["b", "c"], "d"=>{"e"=>"f"}, "g"=>["some longer string"]}
puts JSON.pretty_generate(a,  array_nl:'')
#{
#  "a": [    "b",    "c"  ],
#  "d": {
#    "e": "f"
#  },
#  "g": [    "some longer string"  ]
#}

答案 2 :(得分:0)

只要你想做唯一的事情,我就会选择简单的gsubbing(这里很安全):

▶ #                                  ⇓ ldelim  ⇓ not nest ⇓ cnt ⇓ rdelim
▶ puts JSON.pretty_generate(a).gsub(/(?<=\[|\{)[^\[\{\]\}]{,30}(?=\]|\})/m) do |m| 
  m.gsub(/\s+/, ' ').strip
end
#⇒ {
#  "a": ["b", "c"],
#  "d": {"e": "f"},
#  "g": ["some longer string"]
# }

可配置为允许的“内联”长度(上例中为30)并准备好根据需要打印输出(用空格包围内联,只需更新块中的返回值,赋予{{1} }。)