せっかく天気良いのに花粉がきつくて嫌だね。つーか、気がついたら転職して2年経ってた。
えーと、どこぞのWebAPIやミドルウェアのAPIを叩くとJSONでレスポンスが返ってくることは珍しくない。でもコマンドラインからcurlなどでJSONなレスポンスを貰うと整形されてなくて困ったりする。あと、パースも面倒。なので結局はLLでAPIを叩く簡単なコードを書く必要が出てきたりする。コマンドラインから手軽にJSONの整形やらパースができたらいいんだけどな・・・と思ってたらjqというモノを見つけた。



0. jq

jqについては↓の通り

1.  LLでJSONを整形/パースするとき

例えばRabbitMQのapiを叩くと、JSONなレスポンスが返ってくる。ここで、返ってきたJSONを整形して出力、さらにname属性(キュー名)だけを取得して表示したい場合、おそらく次のようなコードを書くことになる。

https://gist.github.com/hiroakis/5088513

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/local/bin/python

import requests
import json

def call_rabbitmq_api(host, port, user, passwd):
    url = 'http://%s:%s/api/queues' % (host, port)
    r = requests.get(url, auth=(user,passwd))
    return r

def get_queue_name(json_list):
    res = []
    for json in json_list:
        res.append(json["name"])
    return res

if __name__ == '__main__':
    host = 'rabbitmq_host'
    port = 55672
    user = 'basic_auth_user'
    passwd = 'basic_auth_password'
    res = call_rabbitmq_api(host, port, user, passwd)
    print "--- dump json ---"
    print json.dumps(res.json(), indent=4)
    print "--- get queue name ---"
    q_name = get_queue_name(res.json())
    print q_name

2. jqのインストール

んで、jq。次のようにインストールすると、/usr/local/bin/jqにjqコマンドが入ってくれる。make installをするときにrakeを使うので、rakeをインストールしておく必要がある。おれの環境(AWS, Amazon Linux)だと、rakeがrake19ってコマンド名になっててmake installが通らなかったので、Makefileを↓に記載の通りに書き換えてmake installした。

1
2
3
4
5
6
7
8
9
10
11
12
sudo git clone https://github.com/stedolan/jq.git
cd jq
yum install rake
make
make install

# AWS
# diff Makefile Makefile.org
88c88
< ( cd docs; rake19 manpage; ) > $@
---
> ( cd docs; rake manpage; ) > $@

3. jqを使って整形

次のような感じで使う。curlにjqをパイプでつないでやればOK。最後の「.」がミソで、取得したJSONのルート階層から整形して表示。

1
curl -s --basic --user xxxx:xxxx http://xxxxxx:55672/api/queues | /usr/local/bin/jq .

jq01

まあこれくらいだったら、curlをperlをパイプでつないでData::Dumperに渡してやれば同じことができたりもする。でも、それよりは楽だと思う。
さらにjqはJSONの階層を掘り進めていって欲しい属性だけを取得することもできる。

4. jqを使って欲しい属性だけを取得

RabbitMQのレスポンスJSONは、キューの数分のJSON配列になっている。そこで次のようなコマンドで配列インデックス0, 1, 2 番目のキュー情報の、message_stats属性をそれぞれ取得する。インデックスが存在しない場合はnullが返ってくる。

1
2
3
4
5
6
# 0番目の配列のデータのmessage_statsを取得
curl -s --basic --user xxxx:xxxx http://xxxxxx:55672/api/queues | /usr/local/bin/jq '.[0] | .message_stats'
# 1番目の配列のデータのmessage_statsを取得
curl -s --basic --user xxxx:xxxx http://xxxxxx:55672/api/queues | /usr/local/bin/jq '.[1] | .message_stats'
# 2番目の配列のデータのmessage_statsを取得(今回のサンプルではこのインデックスは存在しない)
curl -s --basic --user xxxx:xxxx http://xxxxxx:55672/api/queues | /usr/local/bin/jq '.[2] | .message_stats'

jq02

いい感じ。

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">

Set your Twitter account name in your settings to use the TwitterBar Section.