コマンドラインから JSON が簡単に作れるツール『jo』をEC2にインストールしてみた&ドキュメントを読んでみた

2016.03.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

先日RSSフィードを徘徊していたら下記のエントリがバズっていたので早速EC2環境でも使えるように導入してみよう、そしてどんな事が出来るのか実際試してみようと思い、現時点で公開されているドキュメントをざっくり読んでみました。当エントリはそのまとめ内容となります。

JSONパーサーとしては『jq』が有名ですが『jo』は逆にJSONオブジェクトをコマンドラインから生成するツールとなっています。Jan-Piet Mens氏により、ソースコード及びドキュメントがgithubで公開されています。

『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周りの処理をより快適に・スムーズに行なえる事も期待出来そうですね。こちらからは以上です。