[英]Printing printing JSON in Ruby - with line wrapping
用智能換行在 Ruby中漂亮地打印JSON的最佳方法是什么,即underscore-cli中的“ json”輸出格式化程序處理它的方式是什么?
例如,常規的JSON漂亮打印機將輸出:
{
"a": [
"b",
"c"
],
"d": {
"e": "f"
},
"g": [
"some longer string"
]
}
但是我正在尋找一個可配置的漂亮的Ruby打印機,就像underscore-cli一樣,它會注意到小的結構導致毫無意義的短行,因此輸出如下所示:
{
"a": [ "b", "c" ],
"d": { "e": "f" },
"g": [ "some longer string" ]
}
我試過了JSON.generate()
可用的選項(空格,space_before等),但無濟於事。
我正在編寫一個腳本,該腳本生成旨在被人類合理理解的多個JSON文件(如果需要的話)-我不能期望在任何地方都可以使用下划線,因此我無法(而且,哦,我不想)將輸出通過下划線進行傳遞,但默認的JSON.pretty_generate()
輸出的文件可讀性差得多,其下划線的數量約為下划線的三倍(2,200行vs 750)。
Ruby 2.0.0p481。
看起來neatjson可以滿足 我的要求 。
如果您的需求很小,則可以使用JSON#generate
opts避免使用額外的gem。 雖然我完全同意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
的返回值更新為block即可)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.