Techioz Blog

Ruby JSON.pretty_generate での余分な行の回避

概要

次のような形式の JSON を生成したいと考えています。

{
   "a": {
       "b": 1
   },
   "c": [
       2
   ],
   "d": [],
   "e": {}
}

これは、Python、JavaScript、Go の標準 JSON サポートを使用して簡単に実行できます。

Ruby では、その正確な出力を取得するのに苦労しています。

$ ~/.rbenv/versions/2.6.3/bin/irb 
irb(main):001:0> require 'json'
=> true
irb(main):002:0> puts JSON.pretty_generate({"a" => {"b" => 1}, "c" => [2], "d" => [], "e" => {}})
{
  "a": {
    "b": 1
  },
  "c": [
    2
  ],
  "d": [

  ],
  "e": {
  }
}
=> nil

問題点:

Ruby の標準 JSON サポートを取得して、必要な出力をレンダリングする簡単な方法はありますか?

解決策

✅ 空の配列/ハッシュが 3 行ではなく 1 行でレンダリングされる JSON を生成するのに、neatjson gem が便利であることがわかりました。

このオンライン ビジュアル ツールを使用して、アドホック オプションを見つけることができます。

gem installneatjson を使用するか、Gemfile に gem ‘neatjson’, ‘0.9’ を追加してインストールできます (この記事の執筆時点では 0.9 が最新バージョンでした。自由に調整してください)。

次に、それを使用して期待される出力を取得する方法を次に示します。

require 'json'
require 'neatjson'

structure = {
  "a" => {"b" => 1},
  "c" => [2],
  "d" => [],
  "e" => {}, 
  "f" => "string with [     ] and {       }"
}

json = JSON.neat_generate(
  structure,
  { 
    wrap:        true,
    indent:      '    ',
    after_colon: 1,
    after_comma: 1
  }
)
puts "#{json}\n"

これが役立つことを願っています。JSON.pretty_generate を設定する方法が見つかりませんでした。この問題は、neatjson で解決できます。 JSON 文字列を微調整するための無数のオプションが提供されます。