📺

JSONをいい感じに見るCLIを作った

2021/09/06に公開

JSON をいい感じに見るための CLI を作ったので紹介します。

作ったもの

リストになった JSON を見やすく整形するための CLI です。
テーブル表示にするので TableView から TV という名前にしました。

インストール方法

Mac の方は homebrew を使ってインストールすることができます。

$ brew install uzimaru0000/tap/tv

また Cargo が入っている人は cargo install でもインストールできます。
その際、 tv ではなく tv-cli なので注意してください。

$ cargo install tv-cli

その他 OS の方は GitHub のrelease ページから DL することができます。

使い方

tv はミニマムな CLI として作ったのでテーブル表示の機能とそれに付随したオプションのみを提供しています。

  • 配列になっている JSON をテーブル表示する
  • キーを指定することでそのキーを使ってソートできる
  • いくつかのスタイルでテーブルを表示できる

以上が主の機能です。

Table 表示

ユースケースとして JSON が帰ってくる API を想定します。
API の例として jsonplaceholder を利用します。
今回は https://jsonplaceholder.typicode.com/users を使います。
この API は以下のようなデータが返ってきます。

$ curl -s https://jsonplaceholder.typicode.com/users
[
  {
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    },
    "phone": "1-770-736-8031 x56442",
    "website": "hildegard.org",
    "company": {
      "name": "Romaguera-Crona",
      "catchPhrase": "Multi-layered client-server neural-net",
      "bs": "harness real-time e-markets"
    }
  },
  ...
]

このデータを見やすくテーブル表示をするためにパイプを使って tv に入力します。

$ curl -s https://jsonplaceholder.typicode.com/users | tv
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|id|name                    |username        |email                    |address|phone                |website      |company|
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|1 |Leanne Graham           |Bret            |Sincere@april.biz        |...    |1-770-736-8031 x56442|hildegard.org|...    |
|2 |Ervin Howell            |Antonette       |Shanna@melissa.tv        |...    |010-692-6593 x09125  |anastasia.net|...    |
|3 |Clementine Bauch        |Samantha        |Nathan@yesenia.net       |...    |1-463-123-4447       |ramiro.info  |...    |
|4 |Patricia Lebsack        |Karianne        |Julianne.OConner@kory.org|...    |493-170-9623 x156    |kale.biz     |...    |
|5 |Chelsey Dietrich        |Kamren          |Lucio_Hettinger@annie.ca |...    |(254)954-1289        |demarco.info |...    |
|6 |Mrs. Dennis Schulist    |Leopoldo_Corkery|Karley_Dach@jasper.info  |...    |1-477-935-8478 x6430 |ola.org      |...    |
|7 |Kurtis Weissnat         |Elwyn.Skiles    |Telly.Hoeger@billy.biz   |...    |210.067.6132         |elvis.io     |...    |
|8 |Nicholas Runolfsdottir V|Maxime_Nienow   |Sherwood@rosamond.me     |...    |586.493.6943 x140    |jacynthe.com |...    |
|9 |Glenna Reichert         |Delphine        |Chaim_McDermott@dana.io  |...    |(775)976-6794 x41206 |conrad.com   |...    |
|10|Clementina DuBuque      |Moriah.Stanton  |Rey.Padberg@karina.biz   |...    |024-648-3804         |ambrose.net  |...    |
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+

このように見やすいテーブル表示に変換できました。
要素数が多い場合は less コマンドなどを通すことで更に見やすくなります。
また、すでに json ファイルとして手元にある場合はコマンドの引数として path を入れることでも利用できます。

$ tv data.json

見た目を変える

tv はいくつかのスタイル変更のオプション --style があります。
オプションは以下のとおりです。

  • ascii
    • デフォルトで適応される
  • sharp
  • rounded
  • markdown
    • markdown のテーブル表示
  • plane
    • 罫線が表示されない

お好みの表示スタイルを利用してみてください。

--style rounded を適用した場合
$ curl -s https://jsonplaceholder.typicode.com/users | tv --style --rounded
╭──┬────────────────────────┬────────────────┬─────────────────────────┬───────┬─────────────────────┬─────────────┬───────╮
│id│name                    │username        │email                    │address│phone                │website      │company│
├──┼────────────────────────┼────────────────┼─────────────────────────┼───────┼─────────────────────┼─────────────┼───────┤
│1 │Leanne Graham           │Bret            │Sincere@april.biz        │...    │1-770-736-8031 x56442│hildegard.org│...    │
│2 │Ervin Howell            │Antonette       │Shanna@melissa.tv        │...    │010-692-6593 x09125  │anastasia.net│...    │
│3 │Clementine Bauch        │Samantha        │Nathan@yesenia.net       │...    │1-463-123-4447       │ramiro.info  │...    │
│4 │Patricia Lebsack        │Karianne        │Julianne.OConner@kory.org│...    │493-170-9623 x156    │kale.biz     │...    │
│5 │Chelsey Dietrich        │Kamren          │Lucio_Hettinger@annie.ca │...    │(254)954-1289        │demarco.info │...    │
│6 │Mrs. Dennis Schulist    │Leopoldo_Corkery│Karley_Dach@jasper.info  │...    │1-477-935-8478 x6430 │ola.org      │...    │
│7 │Kurtis Weissnat         │Elwyn.Skiles    │Telly.Hoeger@billy.biz   │...    │210.067.6132         │elvis.io     │...    │
│8 │Nicholas Runolfsdottir V│Maxime_Nienow   │Sherwood@rosamond.me     │...    │586.493.6943 x140    │jacynthe.com │...    │
│9 │Glenna Reichert         │Delphine        │Chaim_McDermott@dana.io  │...    │(775)976-6794 x41206 │conrad.com   │...    │
│10│Clementina DuBuque      │Moriah.Stanton  │Rey.Padberg@karina.biz   │...    │024-648-3804         │ambrose.net  │...    │
╰──┴────────────────────────┴────────────────┴─────────────────────────┴───────┴─────────────────────┴─────────────┴───────╯

ヘッダーを表示させないようにする

デフォルトではキー名が表示されますが、場合によっては要らないかもしれません。
そこで --no-headers オプションを利用することで表示を消すことができます。

$ curl -s https://jsonplaceholder.typicode.com/users | tv --no-headers
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|1 |Leanne Graham           |Bret            |Sincere@april.biz        |...    |1-770-736-8031 x56442|hildegard.org|...    |
|2 |Ervin Howell            |Antonette       |Shanna@melissa.tv        |...    |010-692-6593 x09125  |anastasia.net|...    |
|3 |Clementine Bauch        |Samantha        |Nathan@yesenia.net       |...    |1-463-123-4447       |ramiro.info  |...    |
|4 |Patricia Lebsack        |Karianne        |Julianne.OConner@kory.org|...    |493-170-9623 x156    |kale.biz     |...    |
|5 |Chelsey Dietrich        |Kamren          |Lucio_Hettinger@annie.ca |...    |(254)954-1289        |demarco.info |...    |
|6 |Mrs. Dennis Schulist    |Leopoldo_Corkery|Karley_Dach@jasper.info  |...    |1-477-935-8478 x6430 |ola.org      |...    |
|7 |Kurtis Weissnat         |Elwyn.Skiles    |Telly.Hoeger@billy.biz   |...    |210.067.6132         |elvis.io     |...    |
|8 |Nicholas Runolfsdottir V|Maxime_Nienow   |Sherwood@rosamond.me     |...    |586.493.6943 x140    |jacynthe.com |...    |
|9 |Glenna Reichert         |Delphine        |Chaim_McDermott@dana.io  |...    |(775)976-6794 x41206 |conrad.com   |...    |
|10|Clementina DuBuque      |Moriah.Stanton  |Rey.Padberg@karina.biz   |...    |024-648-3804         |ambrose.net  |...    |
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+

ネストしているフィールドも表示する

デフォルトではプリミティブな値のみが表示されそれ以外は ... で表示されます。
この場合、表示したいフィールドを jq などで取り出して tv に渡すことが望ましいですが全てのネストしたフィールドを表示するオプションもあります。
-r, --recursive オプションを利用することで以下のような表示になります。

$ curl -s https://jsonplaceholder.typicode.com/users | tv -r
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|id|name                    |username        |email                    |address|phone                |website      |company|
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|1 |Leanne Graham           |Bret            |Sincere@april.biz        |...    |1-770-736-8031 x56442|hildegard.org|...    |
|2 |Ervin Howell            |Antonette       |Shanna@melissa.tv        |...    |010-692-6593 x09125  |anastasia.net|...    |
|3 |Clementine Bauch        |Samantha        |Nathan@yesenia.net       |...    |1-463-123-4447       |ramiro.info  |...    |
|4 |Patricia Lebsack        |Karianne        |Julianne.OConner@kory.org|...    |493-170-9623 x156    |kale.biz     |...    |
|5 |Chelsey Dietrich        |Kamren          |Lucio_Hettinger@annie.ca |...    |(254)954-1289        |demarco.info |...    |
|6 |Mrs. Dennis Schulist    |Leopoldo_Corkery|Karley_Dach@jasper.info  |...    |1-477-935-8478 x6430 |ola.org      |...    |
|7 |Kurtis Weissnat         |Elwyn.Skiles    |Telly.Hoeger@billy.biz   |...    |210.067.6132         |elvis.io     |...    |
|8 |Nicholas Runolfsdottir V|Maxime_Nienow   |Sherwood@rosamond.me     |...    |586.493.6943 x140    |jacynthe.com |...    |
|9 |Glenna Reichert         |Delphine        |Chaim_McDermott@dana.io  |...    |(775)976-6794 x41206 |conrad.com   |...    |
|10|Clementina DuBuque      |Moriah.Stanton  |Rey.Padberg@karina.biz   |...    |024-648-3804         |ambrose.net  |...    |
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+

# company
+------------------+----------------------------------------+------------------------------------+
|name              |catchPhrase                             |bs                                  |
+------------------+----------------------------------------+------------------------------------+
|Romaguera-Crona   |Multi-layered client-server neural-net  |harness real-time e-markets         |
|Deckow-Crist      |Proactive didactic contingency          |synergize scalable supply-chains    |
|Romaguera-Jacobson|Face to face bifurcated interface       |e-enable strategic applications     |
|Robel-Corkery     |Multi-tiered zero tolerance productivity|transition cutting-edge web services|
|Keebler LLC       |User-centric fault-tolerant solution    |revolutionize end-to-end systems    |
|Considine-Lockman |Synchronised bottom-line interface      |e-enable innovative applications    |
|Johns Group       |Configurable multimedia task-force      |generate enterprise e-tailers       |
|Abernathy Group   |Implemented secondary concept           |e-enable extensible e-tailers       |
|Yost and Sons     |Switchable contextually-based project   |aggregate real-time technologies    |
|Hoeger LLC        |Centralized empowering task-force       |target end-to-end models            |
+------------------+----------------------------------------+------------------------------------+

# address
+-----------------+---------+--------------+----------+---+
|street           |suite    |city          |zipcode   |geo|
+-----------------+---------+--------------+----------+---+
|Kulas Light      |Apt. 556 |Gwenborough   |92998-3874|...|
|Victor Plains    |Suite 879|Wisokyburgh   |90566-7771|...|
|Douglas Extension|Suite 847|McKenziehaven |59590-4157|...|
|Hoeger Mall      |Apt. 692 |South Elvis   |53919-4257|...|
|Skiles Walks     |Suite 351|Roscoeview    |33263     |...|
|Norberto Crossing|Apt. 950 |South Christy |23505-1337|...|
|Rex Trail        |Suite 280|Howemouth     |58804-1099|...|
|Ellsworth Summit |Suite 729|Aliyaview     |45169     |...|
|Dayna Park       |Suite 449|Bartholomebury|76495-3109|...|
|Kattie Turnpike  |Suite 198|Lebsackbury   |31428-2261|...|
+-----------------+---------+--------------+----------+---+

# geo
+--------+---------+
|lat     |lng      |
+--------+---------+
|-37.3159|81.1496  |
|-43.9509|-34.4618 |
|-68.6102|-47.0653 |
|29.4572 |-164.2990|
|-31.8129|62.5342  |
|-71.4197|71.7478  |
|24.8918 |21.8984  |
|-14.3990|-120.7677|
|24.6463 |-168.8889|
|-38.2386|57.2232  |
+--------+---------+

任意のフィールドでソートする

任意のフィールドの値でテーブルをソートすることができます。
-s, --sort オプションにフィールド名を渡すことでその値でソートされます。

$ curl -s https://jsonplaceholder.typicode.com/users | tv -s username
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|id|name                    |username        |email                    |address|phone                |website      |company|
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|2 |Ervin Howell            |Antonette       |Shanna@melissa.tv        |...    |010-692-6593 x09125  |anastasia.net|...    |
|1 |Leanne Graham           |Bret            |Sincere@april.biz        |...    |1-770-736-8031 x56442|hildegard.org|...    |
|9 |Glenna Reichert         |Delphine        |Chaim_McDermott@dana.io  |...    |(775)976-6794 x41206 |conrad.com   |...    |
|7 |Kurtis Weissnat         |Elwyn.Skiles    |Telly.Hoeger@billy.biz   |...    |210.067.6132         |elvis.io     |...    |
|5 |Chelsey Dietrich        |Kamren          |Lucio_Hettinger@annie.ca |...    |(254)954-1289        |demarco.info |...    |
|4 |Patricia Lebsack        |Karianne        |Julianne.OConner@kory.org|...    |493-170-9623 x156    |kale.biz     |...    |
|6 |Mrs. Dennis Schulist    |Leopoldo_Corkery|Karley_Dach@jasper.info  |...    |1-477-935-8478 x6430 |ola.org      |...    |
|8 |Nicholas Runolfsdottir V|Maxime_Nienow   |Sherwood@rosamond.me     |...    |586.493.6943 x140    |jacynthe.com |...    |
|10|Clementina DuBuque      |Moriah.Stanton  |Rey.Padberg@karina.biz   |...    |024-648-3804         |ambrose.net  |...    |
|3 |Clementine Bauch        |Samantha        |Nathan@yesenia.net       |...    |1-463-123-4447       |ramiro.info  |...    |
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+

セルの整列する位置を指定する

デフォルトだと左揃えになるのですが、 -a, --align オプションを使うことで整列する位置を指定できます。
取りうる値は

  • left
  • center
  • right

の 3 つです。

$ curl -s https://jsonplaceholder.typicode.com/users | tv -a center
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
|id|          name          |    username    |          email          |address|        phone        |   website   |company|
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+
| 1|      Leanne Graham     |      Bret      |    Sincere@april.biz    |  ...  |1-770-736-8031 x56442|hildegard.org|  ...  |
| 2|      Ervin Howell      |    Antonette   |    Shanna@melissa.tv    |  ...  | 010-692-6593 x09125 |anastasia.net|  ...  |
| 3|    Clementine Bauch    |    Samantha    |    Nathan@yesenia.net   |  ...  |    1-463-123-4447   | ramiro.info |  ...  |
| 4|    Patricia Lebsack    |    Karianne    |Julianne.OConner@kory.org|  ...  |  493-170-9623 x156  |   kale.biz  |  ...  |
| 5|    Chelsey Dietrich    |     Kamren     | Lucio_Hettinger@annie.ca|  ...  |    (254)954-1289    | demarco.info|  ...  |
| 6|  Mrs. Dennis Schulist  |Leopoldo_Corkery| Karley_Dach@jasper.info |  ...  | 1-477-935-8478 x6430|   ola.org   |  ...  |
| 7|     Kurtis Weissnat    |  Elwyn.Skiles  |  Telly.Hoeger@billy.biz |  ...  |     210.067.6132    |   elvis.io  |  ...  |
| 8|Nicholas Runolfsdottir V|  Maxime_Nienow |   Sherwood@rosamond.me  |  ...  |  586.493.6943 x140  | jacynthe.com|  ...  |
| 9|     Glenna Reichert    |    Delphine    | Chaim_McDermott@dana.io |  ...  | (775)976-6794 x41206|  conrad.com |  ...  |
|10|   Clementina DuBuque   | Moriah.Stanton |  Rey.Padberg@karina.biz |  ...  |     024-648-3804    | ambrose.net |  ...  |
+--+------------------------+----------------+-------------------------+-------+---------------------+-------------+-------+

最後に

JSON で返ってくる API の確認に便利だと思うのでぜひ利用してみてください!
利用していてバグ等がありましたら issue で報告してくれるとありがたいです。
また、欲しい機能があったら discussion にコメントをくれると嬉しいです。

https://github.com/uzimaru0000/tv

Discussion