コマンドラインから JSON を扱うツールとしては jq が一般的ですが、例えば ls を実行した結果を JSON の Array にしたいであったり、コマンドライン引数から簡単に Object を作りたいといった場合には一旦考え込まないといけないくらい使い方が難しかったりします。そんな中でひょいと現れたのが jo です。
GitHub - jpmens/jo: JSON output from a shell
JSON output from a shell
https://github.com/jpmens/jo
作者である jpmens さんがなぜ jo を作るに至ったかをブログに書いています。
Jan-Piet Mens :: A shell command to create JSON: jo
A shell command to create JSON: jo
http://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/
JSON を書くという行為は、プレースホルダ的に考えないといけなかったり、エスケープを気にしないといけなかったりと実は色々と思考停止要素を含んでいます。しかし jo であればとても直観的に JSON を生成する事が出来ます。
まずは引数から簡単に Object を作ります。
$ jo name=Jane
{"name":"Jane"}
シェルの引数で変数やコマンド展開を使うとエスケープを気にせず JSON を出力出来ます。
$ jo time=$(date +%s) dir=$HOME
{"time":1457195712,"dir":"/Users/jpm"}
配列も簡単
$ jo -p -a spring summer winter
[
"spring",
"summer",
"winter"
]
-p
オプションを付与すると pretty print になります。shell に慣れている人であれば複雑な JSON でも割と簡単に出力出来ます。
$ jo -p name=JP object=$(jo fruit=Orange hungry@0 point=$(jo x=10 y=20) number=17) sunday@0
{
"name": "JP",
"object": {
"fruit": "Orange",
"hungry": false,
"point": {
"x": 10,
"y": 20
},
"number": 17
},
"sunday": false
}
引数を与えない場合、標準入力を読み込むのでコマンドの出力結果から配列を作るのも簡単。
$ seq 1 10 | jo -a
[1,2,3,4,5,6,7,8,9,10]
使い方はマニュアルに書かれています。
jo/jo.md at master · jpmens/jo · GitHub
NAME jo - JSON output from a shell SYNOPSIS jo [-p] [-a] [word ...] DESCRIPTION jo creates a JSON st...
https://github.com/jpmens/jo/blob/master/jo.md
ちなみに jo は Windows でもきちんと動作して、コマンドラインからマルチバイトを与えられても化けずに出力されます。
入力元がストリームの場合は utf-8 として扱い、画面からの入力であった場合には自動的に utf-8 へ変換されます。出力も同様です。ログから必要な部分のみを grep して sed で加工して別の処理に JSON として渡したい、そんなニーズに簡単に答えられそうなツールです。