簡體   English   中英

在Ruby中打印打印JSON-帶換行

[英]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。

如果您的需求很小,則可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM