19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

話題のjoを試してみた

Last updated at Posted at 2016-03-10

コマンドラインから簡単にJSON形式のテキストを作成できるというjoを試してみました。

jo
jpmens/jo: JSON output from a shell

インストール

インストール方法はいくつかあるようですが、git cloneでソースからコンパイルする方法でインストールを行いました。

$ git clone git://github.com/jpmens/jo.git
$ cd jo
$ autoreconf -i # autoconfパッケージに含まれています
$ ./configure
$ make
$ sudo make install

※ autoreconfコマンドがインストールされていない場合は、下記パッケージをインストールしておきます。

$ sudo yum install autoconf -y
$ sudo yum install automake -y

無事にインストールが完了すると、joコマンドとマニュアルがインストールされます。

$ which jo
/usr/local/bin/jo
$ man jo

joコマンドの使い方

joのコマンド引数にkey=valueを指定すると、JSONオブジェクトを作成できます。

$ jo key=value
{"key":"value"}
$ jo name=jo version=0.7
{"name":"jo","version":0.7}

-pオプションを指定すると見やすい形式に整形されて出力されます。

$ jo name=jo version=0.7 -p
{
   "name": "jo",
   "version": 0.7
}

配列を作りたい場合は-aオプションを指定します。

$ jo A B C -a
["A","B","C"]

BOOL値を作りたい場合は、=の代わりに@を使います。

$ jo hungry@1
{"hungry":true}

以下の値はtrueとなり、それ以外はfalseとなります。

  • 0以外の数字
  • Tまたはtで始まる文字
$ jo a@T b@true c@1 A@F B@false C@0 -p
{
   "a": true,
   "b": true,
   "c": true,
   "A": false,
   "B": false,
   "C": false
}

null値を作りたい場合は、=または@に続く文字を空にします。

$ jo name=
{"name":null}
$ jo name@
{"name":null}

要素をネストしたい場合は、joコマンドを組み合わせます。

$ jo key1=value1 obj=$(jo key2=value2) -p
{
   "key1": "value1",
   "obj": {
      "key2": "value2"
   }
}

※上記ではネストする要素の作成に$(コマンド)を使いましたが、`コマンド`でも結果は同じです。

$ jo key1=value1 obj=`jo key2=value2` -p
{
   "key1": "value1",
   "obj": {
      "key2": "value2"
   }
}

[]を使い配列やオブジェクトを作成する方法もあります。

$ jo num[]=1 num[]=2 geo[lat]=123 geo[lon]=456 -p
{
   "num": [
      1,
      2
   ],
   "geo": {
      "lat": 123,
      "lon": 456
   }
}

数値を文字列にしたい場合は、エスケープしたダブルクォーテーションで数値を囲みます。

$ jo num=\"123\"
{"num":"123"}

標準入力からデータを受け取ることも出来ます。

$ seq 1 5 | jo -a
[1,2,3,4,5]

※2016-03-16追記
jo v1.0がリリースされていました。
ファイルの内容の展開や、BASE64エンコードが出来るようになったようです。

ファイルの内容をBASE64エンコードする場合は、ファイル名の前に%をつけます。

$ jo image=%image.png -p
{
   "image": "44GN44GV44G+Ieimi+OBpuOBhOOCi+OBquODgyEK44GN44GV44G+Ieimi+OBpuOBhOOCi+OBquODgyEK44GN44GV44G+Ieimi+OBpuOBhOOCi+OBquODgyEK"
}

ファイル名の前に@をつけると、ファイルの内容をそのまま展開します。

$ jo authors=@AUTHORS -p
{
   "authors": "Jan-Piet Mens <jpmens@gmail.com>"
}

応用

カレントディレクトリのファイル一覧をJSON配列にする。

$ jo * -ap
[
   "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",
   "test-driver",
   "tests.sh"
]

composer.jsonを作る。

$ jo require=$(jo phpunit/phpunit=4.8.\*) -p > composer.json
$ more composer.json
{
   "require": {
      "phpunit/phpunit": "4.8.*"
   }
}

環境変数をJSON化する。

$ env | jo -p
{
   ...略...
   "SHELL": "/bin/bash",
   "SSH_TTY": "/dev/pts/0",
   "LANG": "ja_JP.UTF-8",
   "_": "/bin/env"
   ...略...
}

key=value形式の設定ファイルをJSON化する。

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
PERSISTENT_DHCLIENT=yes

$ jo < /etc/sysconfig/network-scripts/ifcfg-eth0 -p
{
   "DEVICE": "eth0",
   "BOOTPROTO": "dhcp",
   "ONBOOT": "yes",
   "TYPE": "Ethernet",
   "USERCTL": "yes",
   "PEERDNS": "yes",
   "IPV6INIT": "no",
   "PERSISTENT_DHCLIENT": "yes"
}

100までの素数をJSON化する。

$ jo prime_number=$(seq 2 100 | factor | awk 'NF==2 {print $2}' | jo -a)
{"prime_number":[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]}

自分が何者であるかをJSON化する。

$ jo name=$(whoami)
{"name":"hoge"}

joを使ってみた感想

便利そうなコマンドではありますが、今のところ、うまい活用法がみつかりませんでした…

19
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?