シェル上でjsonをフォーマットする、各種ツール導入手順と使い方の個人的なまとめ (jq, jsonlint, json.tool)
前書き
シェル上でJSONファイルを読みやすくフォーマットしたり、壊れていないかチェックする上で使えるツールを比較しました。
やりたいこと
シェル上でJSONをフォーマットしたい。また、JSONが壊れていないかチェックしたい。
'{"key": "val"}' # ↑を ↓な感じに。 { "key": "val" }
個人的結論
すぐ使えるのはpython2が入っているだけで使えるjson.tool
JSONを加工したいなら、インストールのしやすさ、JSON加工性能の多彩さではやっぱりjqが圧倒的に良さそう。
しかしPython3系またはnpmがすでに入っているなら、他のツールも候補に上がってきそう。
参考リンク
distributions/README.md at master · nodesource/distributions · GitHub
環境
※ Linuxはvagrantでこちらのboxを取得して、macOS上で動かしてます。vagrant
バージョン | |
---|---|
macOS Catalina | 10.15.6 |
CentOS Linux | 7.6.1810 |
jq | 1.6 |
npm | 6.14.8 |
python | 2.7 |
jsonlint | 1.6.3 |
jq
centOSならインストールが簡単にできます。単にプリントするだけでは無く、加工に関してかなり複雑なことができるので、その様な場合には重宝します。
インストール
1. centOS7へyumを使ってインストールする場合
$ sudo yum install epel-release $ sudo yum install jq
余談: アンインストール
$ sudo yum erase jq # jqインストール時に入る正規表現ライブラリ。jq以外で使っていなければ消しておいた方がいいかも? $ sudo yum erase oniguruma
2. ソースコードを直接落としてくる場合
おすすめはしないです。
Download jq こちらのLinuxの項目から、64-bitと書かれたリンクを取得する。
# すぐ利用可能なバイナリ $ sudo wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 $ cp jq-linux64 /usr/local/bin/jq # vagrant->自分のユーザ $ sudo chown vagrant:vagrant /usr/local/bin/jq # 実行権限つける $ sudo chmod 744 /usr/local/bin/jq $ jq . test.json
使用例
# jsonファイルをフォーマット $ jq . test.json # パイプして標準出力を受け取ることもできる。 $ echo '{"key": "val"}' | jq .
余談
例: jsonオブジェクトが複数行並んでいる場合
$cat test.json {"key1": "val1"} {"key2": "val2"} # 何事もなかったかの様に、それぞれのjsonオブジェクトをフォーマットして出力される。 $jq . test.json { "key1": "val1" } { "key2": "val2" }
jsonlint
npmがすでに入っていたら、jsonlintを使うのもアリかと思います。Python2系のjson.tool
(後述)よりもオプションが豊富ですが、jqと比べると大したことはできません。Python3.8以上のjson.tool
と比べると特にメリットはないです。
エラーメッセージは割と親切です。
インストール
npm導入まで
$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash - # 上記コマンドの結果、以下を実行するようメッセージが表示されます。 $ sudo yum install gcc-c++ make $ sudo yum install -y nodejs
jsonlintのインストール
-g
はグローバルにインストール。自分の環境だと、sudo付けないとダメでした。
$ sudo npm install jsonlint -g
使用例
$ jsonlint test.json { "key1": "val1", "key2": "val2" } # 標準出力を受け取る場合 $ cat test.json | jsonlint
余談
- デフォルトで、jsonが不正な場合のエラーをしっかりとだしてくる。
- オプションがシンプルでとてもわかりやすい。jsonlint - npm
jsonlint: keyでソートして表示する
# 通常 $ jsonlint test.json { "bcd": "val", "abc": "val" } # keyをアルファベット順でソートした。 $ jsonlint test.json --sort-keys { "abc": "val", "bcd": "val" }
pythonのjson.toolモジュール
JAWS-UG CLIのオンライン勉強会に参加した際に教わりました。 pythonは(2系であれば特に)大抵の環境に最初から入っているのでとても便利です。
インストール
python(2.7でもOK)があればすでに利用可能->大抵の環境に入っている。
$ python -m json.tool test.json { "abc": "val", "bcd": "val" }
余談
2系だと大したことはできませんが、3.5以上だとjsonlintと同じ--sort-keys
オプションが使える様になります。
また、3.8系以上では--json-lines
オプションによって、jqと同じ様に一つのファイルに複数のjsonが書かれていてもパースできる様になっています。
結論とまとめ
あくまで個人的な感想です。
- 単にJSONをフォーマットしたい、壊れてないか確かめたいだけなら
json.tool
がもっとも簡単(python入ってたらすぐ使える)- centOS7の場合、次点で
jq
です.(epelレポジトリを入れられれば、yumで取れるため) jsonlint
はnpmが使える状態なら使用を検討すると思います。
- centOS7の場合、次点で
- JSONを加工したい(特定のキーだけ抜きたいなど)なら、インストールのしやすさから
jq
が良さそう。- ただしPython3系が利用可能ならjmespathを使うのもアリだと思います。(個人的にはjmespathの方がjqより遥かにわかりやすいと思います)
JMESPathを使ってJSONをパースするときにPython製ツールjmespath-terminalが便利だった - Qiita