jq だけじゃない JSON ツールのご紹介

<!-- jq だけじゃない JSON ツールのご紹介 -->

# はじめに

JSON を操作するツールと言えば [jq] がよく紹介されますが、要素検索のための構文を覚える必要があり、使いこなすまでにはある程度学習しておく必要があります。そこで今回は `jq` の構文を知らなくても要素検索ができる JSON ツールを 2 つご紹介したいと思います。

ご紹介するツールは `gron` と `fx` というツールになりますが、これらは `jq` と比較して JSON の要素検索の仕方に次のような違いがあります。

| ツール | 要素検索                        |
|--------|---------------------------------|
| jq     | 専用の構文を使用                |
| gron   | grep を使用                     |
| fx     | 対話的 or JavaScript 構文を使用 |

# 動作確認した環境

- Linux

# JSON 操作の動作確認に便利なサイト

ツールの動作確認では [httpbin] というサイトを使用します。`httpbin` は一種のモックサーバで、様々な HTTP リクエストを投げるとそれに応じたレスポンスを返してくれるというサイトです。`httpbin` の中に下記のような JSON を返却してくれるリクエストがあるので、それを使用したいと思います。

```shell
$ curl -s https://httpbin.org/json
{
  "slideshow": {
    "author": "Yours Truly",
    "date": "date of publication",
    "slides": [
      {
        "title": "Wake up to WonderWidgets!",
        "type": "all"
      },
      {
        "items": [
          "Why <em>WonderWidgets</em> are great",
          "Who <em>buys</em> WonderWidgets"
        ],
        "title": "Overview",
        "type": "all"
      }
    ],
    "title": "Sample Slide Show"
  }
}
```

# gron

[gron] は JSON の各要素を 1 行ごとに出力してくれるツールです。例えば `gron` に https://httpbin.org/json を渡すと次のような出力結果が得られます。

```shell
$ gron https://httpbin.org/json
json = {};
json.slideshow = {};
json.slideshow.author = "Yours Truly";
json.slideshow.date = "date of publication";
json.slideshow.slides = [];
json.slideshow.slides[0] = {};
json.slideshow.slides[0].title = "Wake up to WonderWidgets!";
json.slideshow.slides[0].type = "all";
json.slideshow.slides[1] = {};
json.slideshow.slides[1].items = [];
json.slideshow.slides[1].items[0] = "Why <em>WonderWidgets</em> are great";
json.slideshow.slides[1].items[1] = "Who <em>buys</em> WonderWidgets";
json.slideshow.slides[1].title = "Overview";
json.slideshow.slides[1].type = "all";
json.slideshow.title = "Sample Slide Show";
```

ここで例えば値が `"all"` の要素だけ抽出したいときは `grep` にパイプすることで得ることができます。

```shell
$ gron https://httpbin.org/json | grep all
json.slideshow.slides[0].type = "all";
json.slideshow.slides[1].type = "all";
```

さらに `gron --ungron` というコマンドでこの結果を JSON に逆変換することができます。

```shell
$ gron https://httpbin.org/json | grep all | gron --ungron
{
  "slideshow": {
    "slides": [
      {
        "type": "all"
      },
      {
        "type": "all"
      }
    ]
  }
}
```

`gron` は `grep` と組み合わせるだけで簡単に要素の抽出ができます。覚えることが少なくてすぐに使用することができるため、おすすめです。また `gron` の実行結果は JavaScript の構文で書かれているため `.js` ファイルに保存すれば JavaScript コードとして使用することもできます。

# fx

[fx] はターミナル上で使用できる JSON ビューアです。`curl` などで取得した JSON をパイプで `fx` に渡して閲覧するというのが一般的な使い方になります。

[![](https://camo.githubusercontent.com/b5df8c57792e443a18a56cd9a292b1a101ba2391/68747470733a2f2f6d6564762e696f2f6173736574732f66782e676966)](https://github.com/antonmedv/fx)

`fx` は次のような機能を備えています。

- マウスクリックでオブジェクトの展開・折りたたみ
- キー名でフィルタリング
- キー名の補完機能

ビューアとしてだけではなく、`jq` のような要素検索ツールとしても使用できます。要素の検索には JavaScript の構文が使用できます。

```shell
$ curl -s https://httpbin.org/json | fx 'Object.keys(this.slideshow)'
[
  "author",
  "date",
  "slides",
  "title"
]
```

`.fxrc` という設定ファイルをホームディレクトリに作成しておくと `fx` の実行時にその設定を有効にしてくれます。例えば [Lodash] を `fx` で使用したければ下記のように `.fxrc` を定義しておくことで使用できるようになります。

```js:.fxrc
Object.assign(global, require('lodash'));
```

```shell
$ npm install -g lodash
$ export NODE_PATH=$(npm root -g)
$ curl -s https://httpbin.org/json | fx '_.keys(this.slideshow)'
[
  "author",
  "date",
  "slides",
  "title"
]
```

自作した関数を `.fxrc` 内に定義して使用することもできます。`fx` は JSON 操作を JavaScript の構文で実現するので JavaScript の操作に慣れている方であれば `jq` よりも使いやすい面もあるのではないかと思います。

# まとめ

`jq` 以外の JSON ツールを紹介してみました。状況に応じて使い分けると便利だと思うのでぜひお試し下さい。

[jq]: https://stedolan.github.io/jq/
[httpbin]: https://httpbin.org/
[gron]: https://github.com/tomnomnom/gron
[fx]: https://github.com/antonmedv/fx
[Lodash]: https://lodash.com/