在Ruby中打印打印JSON
用smart line wrapping在Ruby中漂亮打印JSON的最佳方法是什么,下划线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()
(space,space_before等)中的选项,但无济于事。
我正在编写一个脚本,生成多个JSON文件,以便人类可以理解(如果需要的话) - 我不能期望下划线到处都可用,所以我不能(也不会想要)只是通过下划线管道输出,但默认的JSON.pretty_generate()
输出文件的可读性要差得多,大约是下划线(2,200行vs 750)的三倍。
Ruby 2.0.0p481。
看起来neatjson会做我想做的事。
如果你的需求是最小的,你可以玩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" ]
#}
只要你只想做唯一的事情,我会用简单的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)的长度进行配置,并且可以根据需要随时打印输出(用空格包围内联,只需更新gsub
的返回值即可)。