「fx」でターミナルからJSONにJavaScriptの関数を実行したり巨大なJSONを折りたたんで表示したりする

「fx」でターミナルからJSONにJavaScriptの関数を実行したり巨大なJSONを折りたたんで表示したりする

APIのレスポンスなどのJSONはターミナルでサクッと確認することが多いです。 この時、JSON自体が巨大な場合だとフォーマットをかけても結局巨大すぎて見るのが辛いなと思っていました。

このような場合にfxというツールを通してJSONを見ると良いかもと思いましたのでこちらで紹介いたします。

fxはビューアーのためだけのツールというわけではないのですが、ひとまず以下をご覧いただくと「巨大なJSONを見るのに良さそう」感が伝わるのではないかと思います。

いかがでしょうか。要するにオブジェクトと配列がたたまれ、インタラクティブに各要素を展開することができます。 開くのが面倒なケースもあると思うのでそこは適時使い分けかなと思いますが、本当に辛いサイズのJSONであればこの形式は嬉しいのではと思いました。

antonmedv/fx | GitHub

そしてそもそもfxはターミナルでJSONに対してJavaScriptの関数を適用するためのツールです。 以下README.mdにて紹介されている利用例を一通り試してみましたので紹介いたします。

試した環境

$ node --version
v8.9.1
$ npm -version
5.8.0

インストール

npm install -g fx

インタラクティブモード

先ほどのアニメーションのように、

引数なしでパイプからfxにJSONを渡してあげるとインタラクティブにJSONを参照できます。

echo '{"key":["value1","value2"]}' | fx

この際オブジェクト、配列は折りたたまれて表示されます。{...}[...]をクリックすることで値が展開されます。

また、以下のコマンドがそれぞれ利用できます。

  • q or Esc or Ctrl + c : インタラクティブモードの終了
  • e or E : 全て展開
  • up or down or k + j : 上下移動
  • g or G : トップ/ボトムへの移動

関数の実行

JSONに対して関数を実行します。

$ echo '{"key":["value1","value2"]}' | fx 'x => x.key[0].toUpperCase()'
VALUE1

アロー関数を使わない場合、thisキーワードで渡された関数を参照できます。

$ echo '{"key":["value1","value2"]}' | fx 'this.key[0].toUpperCase()'
VALUE1

thisは省略可能です。

$ echo '{"key":["value1","value2"]}' | fx '.key[0].toUpperCase()'
VALUE1

関数のチェーン

複数の関数を渡すとそれぞれ適用されます。

$ echo '{"key":["value1","value2"]}' | fx '.key[0] + " string"' '.toUpperCase()'
VALUE1 STRING

ジェネレーター

ジェネレーターが利用できます。

$ echo '{"key":[{"k1":"val1"},{"k2":"val2"}]}' | fx 'yield* this.key;  yield {"k3":"v3"}; yield {"k4":"v4"};'
[
  {
    "k1": "val1"
  },
  {
    "k2": "val2"
  },
  {
    "k3": "v3"
  },
  {
    "k4": "v4"
  }
]

スプレッド構文

スプレット構文によるJSONの展開が可能です。

$ echo '{"age": 3, "name":"jun"}' | fx '{...this, "age": 28}'
{
  "age": 28,
  "name": "jun"
}

npmパッケージの利用

グローバルにインストールしたnpmパッケージを利用できます。

npm install -g uuid
echo '{"age": 28, "name":"jun"}' | fx '{...this, id: require("uuid").v4()}'
{
  "age": 28,
  "name": "jun",
  "id": "646dda81-ea3f-42d8-84d5-5a40ccbb718f"
}

フォーマットの変更

要するにJSONに対してJavaScriptの関数を実行できるので、JSON以外のフォーマットに変更することができます。

$ echo '["a","b","c"]' | fx 'this.forEach(v => console.log(v))' 2>/dev/null | xargs echo
a b c

上記では配列を一行ずつ出力し、xargsに渡しています。

デフォルトだとforEachの戻り値のundefinedも出力されてしまいます。undefinedは標準エラー出力に出力されるため、/dev/nullに捨てています。

まとめ

fxはターミナルでJSONに対してJavaScriptを実行するためのコマンドラインツールです。コマンドラインからパイプで渡したJSONに関数を実行したり、その中でnpmパッケージを利用したり、巨大なJSONを参照する際にオブジェクトや配列を折りたたんで表示したりできます。