jpp
というJSON Pretty-Printer を作りました。
このコマンドはJSONを要素ごとに1つ1つ改行するのではなく、画面内(もしくは指定した幅)に収まる限りできるだけ改行を挟まずに要素を表示します。
そのため、例えばarrayの中身に大量の要素が入っているものや、objectの中身にfieldが大量にあるようなJSONを表示する際、改行をできる限り抑えて表示することによりJSONを見通しよく眺めることができます。
背景
JSONを整形して表示することができるCLIツールとして、jq、jsonppや、 python -m json.tool
などがありますが(jq
はpretty-printのためのツールではないが僕は普段jsonの整形のためによくjq
を使っていた)、
これらの既存のJSON pretty-printerを用いて、先に述べたような要素数の多いnodeを含むJSONをpretty-printしようとすると、画面の中に収まらず、 less
なりを使ってスクロールしないと全体を眺めることができない、全体を眺めることはできるが見通しが悪い。ということに悩みを感じていました。
ということで画面の横幅に収まる限りできるだけ改行を抑えつつpretty-printすることで見通しよくJSONを眺めることのできる jpp
コマンドを作ってみたのでした。
このツールを実装するにあたってはつい先日作った、Wadler's "A Prettier Printer の Go 実装を部分的に用いました。(名前が思いつかず強気な名前になってしまった...)
このライブラリ(の背後にあるアルゴリズム)は GitHub - prettier/prettier: Prettier is an opinionated code formatter. にも使われているpretty-printerの実装を補助するライブラリです。基本的なアルゴリズムの方針は、与えられた幅に収まる限り一行に収め、幅のうちに収まらない場合は改行するというもので、単純ではあるものの非常に強力なライブラリです。
(scalaだと paiges、swiftだとDoctorPretty などの実装があるようです、prettier/prettier
の場合はツールの中に実装が組み込まれています)
JSON以外のpretty-printerを実装するのにも活用できるので、godocや先ほどあげた論文を参考にして使ってみてください。
インストール
Homebrew
$ brew install tanishiking/jpp/jpp
Download binary from GitHub Releases
https://github.com/tanishiking/jpp/releases
Build from source
$ go get -u github.com/tanishiking/jpp
使い方
cat example.json | jpp
のように標準入力に与えたJSONを整形して出力します。
オプションとして、現在 -w
と -i
を提供しており
-w
: 整形時に考慮する幅、jpp
はできる限りこの幅のうちに収まるようにJSONを整形して出力します。- この値は必ずこの幅のうちに収めることを保証するものではないので注意
- 指定しない場合はterminal widthが利用されます。
-i
: インデント、デフォルトは2スペです。
また出力テキストの色を環境変数やシェル変数を使って変更することもできます。詳しくはREADMEを参照してください。https://github.com/tanishiking/jpp
デモ
機会があれば、是非お試しください。