この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
先日RSSフィードを徘徊していたら下記のエントリがバズっていたので早速EC2環境でも使えるように導入してみよう、そしてどんな事が出来るのか実際試してみようと思い、現時点で公開されているドキュメントをざっくり読んでみました。当エントリはそのまとめ内容となります。
JSONパーサーとしては『jq』が有名ですが『jo』は逆にJSONオブジェクトをコマンドラインから生成するツールとなっています。Jan-Piet Mens氏により、ソースコード及びドキュメントがgithubで公開されています。
jo 0.7 released https://t.co/CerP62JH8k (read about it at https://t.co/5z1orYMam4) #json #cli
— Jan-Piet Mens (@jpmens) 2016, 3月 9
『jo』をAmazon Linux EC2にインストールしてみた
まずは環境導入から。GitHubのドキュメントには幾つか方法が展開されていましたが、当エントリではgitからソースをcloneし、ビルドする方法を試してみたいと思います。
Amazon Linux EC2インスタンスを用意し、git cloneでソースコード一式を取得。
$ sudo yum -y update
$ sudo yum -y install git
$ git clone git://github.com/jpmens/jo.git
$ cd jo/
ドキュメントではautoreconfコマンドを実施とありますが、初期状態ではインストールされていないためDevelopment Toolsをインストールして先に進みます。
$ autoreconf -i
-bash: autoreconf: コマンドが見つかりません
$ sudo yum -y groupinstall "Development Tools"
$ autoreconf -i
configure.ac:18: installing './install-sh'
configure.ac:18: installing './missing'
Makefile.am: installing './INSTALL'
Makefile.am: installing './depcomp'
あとは手順通り。
$ ./configure
$ make check
$ sudo make install
導入完了です。
$ jo -v
jo 0.7
$ jo -version
jo 0.7
『jo』のマニュアルを読んでみた
joのマニュアルは以下URLより遷移可能です。そこまでボリュームは大きくなく、コンパクトにまとめられています。
説明
- joは、与えられた引数や標準入力からJSON文字列を標準出力に生成します。
- -aオプションを指定しない場合、joはKeyと、その値(value)からなるkey=valueまたはkey@valueのペアで構成されるJSONオブジェクトを生成します。
- joはJSONで数値や文字列、NULL値を作成するために値の型の推測を試みます。
- joはkey@valueをboolean型のJSON要素として取り扱います: もし値がTで始まっていた、もしくは0より大きな値だった場合、結果はtrueとなり、それ以外の場合はfalseとなります。
- イコール(=)の後に値が無い、または空値の場合、NULLのJSON要素が返ります。
- -aオプションが指定された場合、joはオブジェクトではなく配列を作成します。
実行例
JSONオブジェクトの生成。正しくフォーマットされたfloat型の値の場合は結果が文字列型となる事に注意。
$ jo tst=1457081292 lat=12.3456 cc=FR badfloat=3.14159.26 name="JP Mens" nada= coffee@T
{"tst":1457081292,"lat":12.3456,"cc":"FR","badfloat":"3.14159.26","name":"JP Mens","nada":null,"coffee":true}
現在居るフォルダパス内の要素一覧を-pオプションで綺麗に表示してみた例。
$ jo -p -a *
[
"AUTHORS",
"COPYING",
"ChangeLog",
"INSTALL",
"Makefile",
"Makefile.am",
"Makefile.in",
"NEWS",
"README",
"README.md",
"aclocal.m4",
"autom4te.cache",
"config.log",
"config.status",
"configure",
"configure.ac",
"depcomp",
"install-sh",
"jo",
"jo-logo.png",
"jo.1",
"jo.c",
"jo.md",
"jo.o",
"jo.pandoc",
"json.c",
"json.h",
"json.o",
"missing",
"press.md",
"test-driver",
"test-suite.log",
"tests.sh",
"tests.sh.log",
"tests.sh.trs"
]
オブジェクト内オブジェクトの作成例。もし最初の文字列が左括弧『(』または角括弧『[』の場合、joは残りの部分をJSONとしてデコードしようと試みます。文字列内のスペースに注意。
$ jo -p name=JP object=$(jo fruit=Orange hungry@0 point=$(jo x=10 y=20 list=$(jo -a 1 2 3 4 5)) number=17) sunday@0
{
"name": "JP",
"object": {
"fruit": "Orange",
"hungry": false,
"point": {
"x": 10,
"y": 20,
"list": [
1,
2,
3,
4,
5
]
},
"number": 17
},
"sunday": false
}
-Bオプションを使うと、"true"と"false"の文字列による検出を無効化します。
$ jo switch=true morning@0
{"switch":true,"morning":false}
$ jo -B switch=true morning@0
{"switch":"true","morning":false}
実行オプション
オプション | 説明 |
---|---|
-a | 要素を配列で表示 |
-B | Boolean値の文字列検出を無効化 |
-p | 要素を綺麗に表示 (デフォルト表示はワンライナー形式) |
-v | joのバージョンを表示 |
-V | joのバージョン及び関連情報をJSONで表示 |
オプション:-Vの実行例
$ jo -V
{"program":"jo","author":"Jan-Piet Mens","repo":"https://github.com/jpmens/jo","version":"0.7"}
joのマニュアル表示
## github記載の内容と同じものが出力されました。
$ man jo
バグについて
シェル内部でjoに与えられた値を空文字に展開する場合、joはオブジェクトモードでnullを展開します。配列モードでハングアップしているように見えるかも知れませんが、これは標準入力を呼んでおりハングアップしていません。なのでバグでは無いです。
数値は意図しない値に変換される可能性があります。引用符で数値を囲んだ場合、結果は文字列として生成されます。以下比較例です。
$ jo a=1.0
{"a":1}
$ jo a=\"1.0\"
{"a":"1.0"}
リターンコード
正常終了時には0が返ります。0以外の場合は異常終了。
$ jo switch=true morning@1
{"switch":true,"morning":true}
$ echo $?
0
まとめ
以上、JSON生成ツール『jo』をEC2にインストールしてみた&ドキュメントを読んでみたエントリでした。この手の手順は何かと手間が掛かる部分でもあったため、これだけの簡単さでJSONが作れるのは非常に嬉しいですね。JSONパーサー『jq』との併用でJSON周りの処理をより快適に・スムーズに行なえる事も期待出来そうですね。こちらからは以上です。