たにしきんぐダム

プログラミングやったりアニメやゲーム見たり京都に住んだりしてます

良い感じに詰めて整形してくれる JSON pretty-printer「jpp」を作りました

jpp というJSON Pretty-Printer を作りました。

github.com

このコマンドはJSONを要素ごとに1つ1つ改行するのではなく、画面内(もしくは指定した幅)に収まる限りできるだけ改行を挟まずに要素を表示します。

そのため、例えばarrayの中身に大量の要素が入っているものや、objectの中身にfieldが大量にあるようなJSONを表示する際、改行をできる限り抑えて表示することによりJSONを見通しよく眺めることができます。

f:id:tanishiking24:20181028224432p:plain

背景

JSONを整形して表示することができるCLIツールとして、jqjsonppや、 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.com

このライブラリ(の背後にあるアルゴリズム)は 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スペです。

https://user-images.githubusercontent.com/9353584/47613438-bb96a700-dad2-11e8-872c-4309d4330aef.png

また出力テキストの色を環境変数やシェル変数を使って変更することもできます。詳しくはREADMEを参照してください。https://github.com/tanishiking/jpp

デモ

f:id:tanishiking24:20181028224152g:plain

課題

Elsのマッピングとか、細かいネストが多いものはあまりうまく行かなかったので、もう少しアグレッシブに詰めるようにしてもよいかもしれない

機会があれば、是非お試しください。