qtatsuの週報

初心者ですわぁ

シェル上でjsonをフォーマットする、各種ツール導入手順と使い方の個人的なまとめ (jq, jsonlint, json.tool)

前書き

シェル上でJSONファイルを読みやすくフォーマットしたり、壊れていないかチェックする上で使えるツールを比較しました。

やりたいこと

シェル上でJSONをフォーマットしたい。また、JSONが壊れていないかチェックしたい。

'{"key": "val"}'

# ↑を ↓な感じに。

{
  "key": "val"
}

個人的結論

すぐ使えるのはpython2が入っているだけで使えるjson.tool

JSONを加工したいなら、インストールのしやすさ、JSON加工性能の多彩さではやっぱりjqが圧倒的に良さそう。

しかしPython3系またはnpmがすでに入っているなら、他のツールも候補に上がってきそう。

参考リンク

jq

jsonlint - npm

distributions/README.md at master · nodesource/distributions · GitHub

jsonlint - npm

環境

Linuxvagrantでこちらの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ツールと異なり、デフォルトの挙動で、不完全なjsonを解釈してプリントする。

例: 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"
}

pythonjson.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が使える状態なら使用を検討すると思います。
  • JSONを加工したい(特定のキーだけ抜きたいなど)なら、インストールのしやすさからjqが良さそう。
    • ただしPython3系が利用可能ならjmespathを使うのもアリだと思います。(個人的にはjmespathの方がjqより遥かにわかりやすいと思います)

JMESPathを使ってJSONをパースするときにPython製ツールjmespath-terminalが便利だった - Qiita